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

What is the disadvantage if I use objects on the stack instead of on the heap in factory pattern?

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;
}}

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

您好,欢迎来到 Whosebug!

你应该 return 一个指向堆分配对象的指针,因为如果你 return 一个指向函数范围内的堆栈分配对象的指针,指针指向的对象将被销毁并且使用该指针将导致访问冲突!

希望对您有所帮助!

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

你的return的指针一旦函数return就没用了。简单代码中的类似问题:

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

x 一旦函数 returned 就不再存在并且你有一个悬空指针。取消引用它会导致未定义的行为。

可以通过 x static:

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

现在 x 在函数调用之间持续存在。但是,即使您修复了 "factory" 将始终 return 指向相同对象的指针。如果那是你想要的,那么你一开始就真的不需要工厂。工厂需要创建实例并且 return 它们:

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>();
    }
}

您还需要注意 return 所有分支上的一些事情,您实际上应该使用智能指针而不是原始指针。