如果我在工厂模式中使用堆栈上的对象而不是堆上的对象,有什么缺点?
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 所有分支上的一些事情,您实际上应该使用智能指针而不是原始指针。
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 所有分支上的一些事情,您实际上应该使用智能指针而不是原始指针。