在循环中创建新的指针对象

时间:2010-11-18 20:16:40

标签: c++ pointers new-operator delete-operator

说我做这样的事情

for(int i = 0; i < 10; i++)
{
    //create a pointer object using new
    //use the object
}

在循环中使用它之后是否需要删除指针对象? 我当时想,如果我没有删除它,它将继续创建一个新对象10次,之后对象就会挂在那里,吃掉资源。

5 个答案:

答案 0 :(得分:5)

是的,对于每个new,都需要有相应的delete。 (每个delete[]都有一个new[]。)

然而,C ++的方式是尽可能 避免动态 存储,而是采用 本地自动变量 < / strong>:

for(int i = 0; i < 10; ++i)
{
    some_class object;
    //use object
} // object gets destroyed here automatically 

如果你需要动态分配该对象(我怀疑,但有这种情况),那么 使用智能指针 。智能指针将为您执行delete,无论您离开它所属的范围的方式如何:

for(int i = 0; i < 10; ++i)
{
    smart_ptr<some_class> object(new some_class());
    //use object
} // object gets destroyed here automatically 

当前标准只知道一个名为std::auto_ptr的智能指针,在这种情况下,它会做你需要的。下一个标准将包含更多标准,其中包括std::auto_ptr的替换,名为std::unique_ptr,另一个具有共享所有权语义,名为std::shared_ptr。您的编译器/ std lib实际上可能已经支持它们。如果没有,您可以在boost找到的众多优秀图书馆中找到它们。


顺便说一句,请注意我已将i++替换为++i。如果是int,这对您的方案没有任何影响,但有些类型i++可能会创建不必要的副本。 (如果效率不关心你,为什么用C ++编程?)

答案 1 :(得分:4)

是的。

当你不再需要它时,你必须删除你新用的东西,否则你会得到内存泄漏。

答案 2 :(得分:1)

从技术上讲,您需要删除它们。

但是。我们有这个神奇的东西叫做智能指针,可以自动神奇地做到这一点。

for(int i = 0; i < 10; i++)
{
    std::auto_ptr<int> x(new int(10));

    // automatically deleted after each iteration.
}

答案 3 :(得分:0)

如果您非常倾向于使用智能指针(类似于Boost的shared_pointer),那么一旦指针超出范围最后一次,对象就会被自动删除。

答案 4 :(得分:0)

是的,你需要删除它。但是,在循环的每次迭代中执行新的/删除可能不是最佳选择 - 您需要提供更多上下文以获得更好的建议。