这些问题相对简单。使用向量时,我应该在推回新元素时使用new
运算符吗?我应该拨打哪种发布方法?这就是我的意思:
// Release method: 1.
void ReleaseMethodOne( vector< int * > &ThisVector )
{
// Clear out the vector.
ThisVector.clear( );
return;
}
// Release method: 2.
void ReleaseMethodTwo( vector< int * > &ThisVector )
{
// Clear out the vector.
for( unsigned uIndex( 0 ); uIndex < ThisVector.size( ); uIndex++ )
{
delete ThisVector.at( uIndex );
}
return;
}
int main( )
{
vector< int * > Vector;
// Add a new element.
Vector.push_back( new int( 2 ) );
// More code...
// Free the elements before exiting. Which method should I call here?
ReleaseMethodOne( Vector ); // This one?
ReleaseMethodTwo( Vector ); // Or this one?
return 0;
}
我不久前开始学习向量,我正在学习的这本书说,向量的clear( )
方法称为每个元素析构函数。这适用于new
运营商吗?
答案 0 :(得分:5)
clear
方法确实会调用析构函数。但是,你的向量存储指针,指针的析构函数是一个简单的无操作。它不调用delete
。
因此,简单地调用clear
不会释放您使用int
分配的所有new
个对象的内存。您需要delete
他们。
如果你使用智能指针而不是普通的指针,那么指向的对象将在适当的时候被释放,而你不必做任何特别的事情。
答案 1 :(得分:5)
STL容器存储副本您提供给它们的对象,示例中的指针。他们永远不会释放任何你明确分配的内存。你必须自己释放那个记忆,所以应该使用第二个“释放”方法。
当然,您不需要每new
int
。只需使用vector<int>
- 您根本不需要处理手动内存管理。
答案 2 :(得分:2)
你应该使用ReleaseMethodTwo()
,因为如果你已经分配了内存,那么你的责任就可以删除它。
std::vector::clear()
仅清除向量中的元素。它不会对正在删除的元素调用delete
!
答案 3 :(得分:2)
对于你在那里做的事情,你需要使用ReleaseMethodTwo
。通过说它调用元素的析构函数意味着包含的类(不包含指针)会丢失范围并调用它们的析构函数。
据我所知,没有STL容器会为您调用delete
。如果分配并传入指针,则需要解除分配。
答案 4 :(得分:1)
正如其他人所回答的那样,vector会调用每个元素的析构函数。在您的情况下,元素是指针,因此它不会释放内存。 对于您的应用程序,最好的选择是使用引用计数智能指针,如boost:shared_ptr。一旦没有更多引用指向元素(如您编写的示例),内存将自动释放。
PS:不要使用带有向量的std :: auto_ptr这样的“非引用计数”智能指针。
答案 5 :(得分:0)
如果你使用vactor<int *>
而不是你有一个指针向量,你必须为每个元素分配内存并自己释放这个内存。使用指针向量没有多大意义,除非你想要存储在向量中的类型的大小非常大。
实际上当你执行vector<T>::push_back(val)
时,它会使用复制构造函数val
存储T::T(T &orig)
的副本,并在执行clear()
时调用所有元素的析构函数