例子:
Class *_obj1;
Class *_obj2;
void doThis(Class *obj) {}
void create() {
Class *obj1 = new Class();
Class obj2;
doThis(obj1);
doThis(&obj2);
_obj1 = obj1;
_obj2 = &obj2;
}
int main (int argc, const char * argv[]) {
create();
_obj1->doSomething();
_obj2->doSomething();
return 0;
}
这将创建 2 个对象,创建指向它们的指针,然后 main() 在每个对象上调用一个方法。Class 对象创建一个 char* 并存储 C 字符串“Hello!” 在里面; ~Class() 释放器释放内存。doSomething() 方法使用 printf() 打印出“buff: %s”。很简单。现在,如果我们运行它,我们会得到:
Dealloc
Buff:你好!
增益:¯ø_ˇ
显然堆栈对象在这里不起作用- 很明显,当函数退出时,指针 _obj2 指向堆栈中的某个位置。这就是我在上一个问题中使用堆对象的原因,人们告诉我这是“愚蠢的”。
所以,第一个问题是:如果我如何将堆栈对象(obj2)转换为堆对象,以便在 create() 退出后它不会被释放?我想要一个直截了当的答案,而不是像许多人那样傲慢的“你做错了”。因为在这种情况下堆栈对象无法工作,所以堆对象似乎是唯一的方法。编辑:此外,转换回堆栈对象也很有用。
第二个问题:堆对象“错误”的具体示例是vector<string>*
使用new
运算符创建一个新对象。如果动态分配 STL 对象是错误的,那么正确的方法是什么?显然,如果您将它们创建为堆栈对象,它会失败,因为它们会立即被释放,但我被告知(再次,一个非常高级的成员)动态分配它们会破坏堆。那么正确的方法是什么?