【发布时间】:2012-07-04 07:32:42
【问题描述】:
我正在做一个练习题,问题要求创建一个析构函数以确保没有任何内存泄漏。当我使用这个析构函数时,在执行 system("pause"); 后出现此错误:
这里是复制构造函数:
vector_of_int::vector_of_int ( const vector_of_int& a_vector )
{
an_array = new int[ a_vector.size ];
this->size = a_vector.size;
for( int i = 0; i < size; ++i )
{
an_array[i] = a_vector.an_array[i];
}
}
和赋值运算符:
vector_of_int& vector_of_int::operator= ( const vector_of_int& a_vector )
{
if( this == &a_vector )
{
return *this;
}
this->size = a_vector.size;
for( int i = 0; i < size; ++i )
{
an_array[i] = NULL;
an_array[i] = a_vector.an_array[i];
}
return *this;
}
我在网上搜索了一下,有人提到这可能是由于复制构造函数指向相同的内存位置。为了测试这一点,在我的 main() 函数中,我将数据推送到每个向量 a、b、c 中,然后重新打印它们,它们都是不同的。此错误在调用析构函数后显示并继续执行下一行 system("pause");在按任意键后,它会显示。这里是 main() 的结尾:
a_vector.~vector_of_int();
b_vector.~vector_of_int();
c_vector.~vector_of_int();
cout << "\n";
system("pause");
return 0;
main.exe 是否在 main 的花括号结束后再次调用析构函数?当我评论所有 3 个析构函数语句时,错误不再显示。
谢谢。
【问题讨论】:
-
+1 表示相关代码以及您遵守规则 3 的事实。hmjd 指出了解决方案。
-
您的复制构造函数看起来正确。使用copy-and-swap 实现赋值运算符,它是异常安全、防泄漏且简单的。
标签: c++ class destructor copy-constructor