我是C ++的新手,我试图用不同的方式解除分配对象。这是我的代码:
class foo{
public:
int* bar;
foo(int N){
bar = new int[N];
}
~foo(void){
delete[] bar;
}
};
int main(int argc, char* argv[]){
foo* F = new foo(10);
delete F;
return 0;
}
这很有效,但如果我像这样写主要:
int main(int argc, char* argv[]){
foo F = foo(10);
F.~foo();
return 0;
}
我最终会检测到“glibc”。我想我应该以某种方式解除分配“bar”指针,因为它是在构造期间分配的。
因此我的问题是如何解除这样的对象?感谢。
答案 0 :(得分:3)
对于新的C ++开发人员来说,你的涉猎方式太深了。
该行
foo F = foo(10);
做了很多事情。它在堆栈上分配一个临时的新foo对象。由于没有new
,它不在堆中,临时对象的生命周期就是那一行。它将所述对象复制到变量F.然后它会破坏临时foo。
您的类没有定义复制构造函数,因此C ++按值复制它。在该行的末尾,您最终得到一个包含指向已删除数组的指针的对象。
其余的很明显。第二个删除[]错误输出。
如果您想要一个带有功能范围的foo变量,请执行以下操作:
foo F(10);
而且,不要显式调用析构函数。当函数退出时,C ++将调用它。
通常,管理内存的每个对象都应该定义一个复制构造函数和赋值运算符,或者禁止它们(通过将它们声明为私有)。
实际上,这很少需要,因为已经有大量的类为您管理内存,并且正确地这样做。既然你正在学习,可以至少跳过一次所有的箍,但在现实生活中,std::vector<int>
很乐意为你存储一组int
。