如果在工厂模式下使用堆栈上的对象,而不是堆上的对象,有什么缺点?

问题描述 投票:1回答:2

CPP的代码如下

Operation* OperationFactory:: CreateOperation(char opr) {
OperationAdd resultAdd;
OperationSub resultSub;
OperationMul resultMul;
OperationDiv resultDiv;
switch (opr) {
case '+':
    return &resultAdd;
case '-':
    return &resultSub;
case '*':
    return &resultMul;
case '/':
    return &resultDiv;
default:
    break;
}}

我发现,当我试图改变这个工厂创建的对象的字段时,会出现一些错误。

c++ factory
2个回答
1
投票

一旦函数返回,你返回的指针就没有用了。在更简单的代码中也存在类似的问题。

int* dont_do_this(){
    int x = 0;
    return &x;
}

x 一旦函数返回,你的指针就不复存在了。Dereferencing它导致未定义的行为。

可以通过以下方法来解决这个问题 x static:

int* maybe_do_this() {
    static int x = 0;
    return &x;
}

现在 x 在函数调用之间持续存在。然而,即使你解决了这个问题,你的 "工厂 "也会一直返回指向相同对象的指针。如果这就是你想要的,你就不会真的需要一个工厂。一个工厂应该创建实例并返回它们。

std::unique_ptr<Operation> OperationFactory:: CreateOperation(char opr) {
    switch (opr) {
        case '+':
            return std::make_unique<OperationAdd>();
        case '-':
            return std::make_unique<OperationSub>();
        // ...
        default:
            return std::make_unique<OperationDefault>();
    }
}

同时你需要注意在所有分支上返回一些东西 你应该使用智能指针而不是原始指针。


1
投票

你好,欢迎来到StackOverflow!

你应该返回一个堆分配对象的指针,因为如果你在函数的作用域中返回一个堆分配对象的指针,该指针所指向的对象将被销毁,使用该指针将导致访问违规!

希望对你有所帮助!

我建议使用 std::unique_ptr<> 或自定义类型,管理对象的销毁,因为如果客户端不释放该内存,你可能会造成内存泄漏!

© www.soinside.com 2019 - 2024. All rights reserved.