内存处理C ++使用普通指针

时间:2010-09-30 15:24:06

标签: c++

我遇到类似下面的情况,我在释放内存方面遇到了一些问题。基本上我有一个向量来保存指向classA中对象的指针。我有另一个classB,它存储来自vector的classA的指针。它会利用objB。问题是我需要对向量进行操作以擦除指针。

那么我如何释放objA的记忆,如下面的描述?

  1. 按值传递objA并在objB中复制?

  2. 在objB的析构函数中删除指向objA的指针? (我也不想这样做,因为只有当逻辑满足时,我才需要擦除指针并删除对象。否则,我想保留对象。

    vectorA< CLASSA * GT; VT; ....将多个指向对象的指针存储到矢量

    classB * objB = new classB(vt.at(pos));

    执行了一些逻辑。如果满足,则需要从向量中删除特定对象。

    vt.erase(POS); ==>如果我在这里删除指针,如何释放内存? 我不能在这里调用delete,因为objB可能需要稍后使用objA。

    classB :: classB(classA * objA){  this-> objA = objA; }

  3. 所以有没有办法使用Normal指针释放内存,如上所述? 由于一些回复指示我使用智能指针,我的问题是使用智能指针是否会对性能造成任何惩罚? (就像C#indeterministic垃圾收集器对性能关键应用程序来说并不是真正理想的)。

4 个答案:

答案 0 :(得分:7)

至少随便,听起来你正在寻找shared_ptr

答案 1 :(得分:1)

Avt个对象应该有单个所有者objBobjB

我倾向于前者。

A *这类想要使用vt.at( pos )的类可以像你提到的那样使用A *,但是他们应该保留{{{1}}的副本1}}。

答案 2 :(得分:0)

如果您有Visual Studio 2008 SP1或更高版本,则可以使用std::tr1::shared_ptr。如果不这样做,可以使用boost::shared_ptr(同一个班级)。

将shared_ptr存储在向量中,然后您不必担心内存的释放。

答案 3 :(得分:0)

正如其他人所指出的那样,也许在你改变问题之前,shared_ptr听起来对于矢量来说是一个好主意。您可能还希望在classB引用中使用weak_ptr,以便向量控制生命周期(当weak_ptr过时时,classB必须能够处理)。

对于解除分配,默认情况下,shared_ptr会在引用计数变为0时删除。您可以为shared_ptr指定自定义删除器,以便更好地控制实际发生的情况。查看Boost shared_ptrs的delayed deallocation technique