1

说我做这样的事情

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

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

4

5 回答 5

5

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

但是,C++ 方法是尽可能避免动态存储,而是使用本地自动变量

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, namedstd::unique_ptr和一个具有共享所有权语义的, named std::shared_ptr。您的编译器/标准库实际上可能已经支持它们。如果没有,您可以在boost的众多优秀库中找到它们。


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

于 2010-11-18T20:26:08.920 回答
4

是的。

当您不再需要新的东西时,您必须删除它,否则会导致内存泄漏。

于 2010-11-18T20:18:47.843 回答
1

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

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

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

    // automatically deleted after each iteration.
}
于 2010-11-18T20:26:05.200 回答
0

如果您愿意,您可以使用智能指针(类似于 Boost 的 shared_pointer),然后一旦指针最后一次超出范围,对象就会自动被删除。

于 2010-11-18T20:25:04.083 回答
0

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

于 2010-11-18T20:25:06.690 回答