我的编程背景是 Java 世界,但我才刚刚开始学习 C++。作为一名 Java 程序员,我偶然发现了这个相当微不足道而且可能相当菜鸟的问题,它让我感到困惑:
我有一个带有数组的类,它在构造函数中通过 new 初始化并在析构函数中删除。现在,当我创建此类的一个对象并将此类的另一个对象分配给同一个变量时(至少我是这么认为的),当变量离开时,析构函数中的 delete[] 方法似乎被调用了两次范围(在本例中为 main() 函数)(调试器给我一个 _BLOCK_TYPE_IS_VALID 断言失败警告)。
这是为什么呢?为什么在我将新对象分配给 f 之前不调用解构函数?我如何明确删除 Foo(1)?这里到底发生了什么?
class Foo{
private:
int *field;
public:
Foo(int size){
field = new int[size];
}
~Foo(){
delete[] field;
}
};
int main(){
Foo f = Foo(1);
f = Foo(2);
}
最佳答案
C++ 世界中有一种叫做 Rule Of Three 的东西.
类会自动为您生成析构函数、复制构造函数和赋值运算符。
如果您必须手动定义其中一个函数,您可能必须定义所有这三个函数。
在您的情况下,您应该定义两个复制函数,以便 Foo
的拷贝获得其自己的 field
拷贝。添加这两个函数:
class Foo{
Foo( const Foo &f ) {
size = f.size;
field = new int[size];
std::copy( f.field, f.field + size, field );
}
Foo& operator=( const Foo &f ) {
// Leverage the logic that was already written in the copy constructor
Foo tmp(f);
std::swap( *this, temp );
return *this;
}
};
请注意,我假设您已将 size
存储在 Foo
对象中。无论如何,您可能需要将这些信息存储在现实生活中的应用程序中
关于c++ - 重新分配变量,调用两次删除 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488936/