wza*_*man 1 c++ destructor class copy-constructor
我正在做练习问题,问题是要创建一个析构函数以确保没有任何内存泄漏.当我使用这个析构函数时,我在执行系统后出现此错误("暂停");
这是复制构造函数:
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];
}
}
Run Code Online (Sandbox Code Playgroud)
和赋值运算符:
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;
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了一下,有人提到它可能是由于复制构造函数指向相同的内存位置.为了测试这一点,在我的main()函数中,我将数据推送到每个向量a,b,c中,并重新打印它们,它们都是不同的.调用析构函数后会显示此错误,然后进入下一行系统("暂停"); 按任意键后,显示.这是main()的结尾:
a_vector.~vector_of_int();
b_vector.~vector_of_int();
c_vector.~vector_of_int();
cout << "\n";
system("pause");
return 0;
Run Code Online (Sandbox Code Playgroud)
main.exe的花括号结束后,main.exe是否再次调用析构函数?当我评论所有3个析构函数语句时,错误不再显示.
谢谢.
不要明确地调用析构函数,当对象超出范围时会自动发生(从代码中,我相信在给定.用于调用析构函数的符号的情况下,向量是堆栈分配的).即使它们是在堆上分配使用new,你仍然不会显式地调用析构函数,而是使用它delete.
此外,在赋值运算符this->size中更新但an_array不是.如果a_vector.size > this->size那样它将导致越界访问,an_array因为它没有足够的元素:delete[]和new[] an_array.