带矢量的新算子

时间:2011-01-25 22:16:05

标签: c++ vector new-operator operator-keyword

这些问题相对简单。使用向量时,我应该在推回新元素时使用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运营商吗?

6 个答案:

答案 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()时调用所有元素的析构函数