繁体   English   中英

stl 矢量 memory 管理

[英]stl vector memory management

我正在使用 borland 2006 c++,并有以下代码。 我正在使用向量,并且无法理解为什么不调用析构函数。

基本上我有一个 class A

class A
{
private:
    TObjectList* list;
    int myid;
public:
 __fastcall A(int);
 __fastcall ~A();
};

__fastcall A::A(int num)
{
    myid = num;
    list = new TObjectList();

}

__fastcall A::~A()
{
    delete list;
}

int main(int argc, char* argv[])
{
    myfunc();
    return 0;
}

void myfunc()
{
    vector<A*> vec;
    vec.push_back(new A(1));
    vec.push_back(new A(2));
}

根据我的阅读,当变量 vec 在 myfunc() 中超出 scope 时,它应该破坏它包含的元素,所以应该调用 A 的析构函数。 我在 ~A() 处有一个断点,但从未被调用,我也尝试过 resize() 和擦除方法

TIA

vec 在超出 scope 时确实会破坏它的元素。这里的问题是 vec 的元素是指向A 对象的指针,而不是 A 对象本身。 如果你反而做了

vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));

...那么事情就会如你所愿。

ETA:不过请注意,如果你这样做,你必须为 A 定义一个复制构造函数。这应该涉及对 TObjectList 成员进行深层复制。 否则,当您复制 A object 时,您将得到两个指向同一个 TObjectList 的对象,并且当第二个 object 被销毁时,您的程序将崩溃。

未调用A的析构函数,因为您没有A的向量。 您有一个指向A的指针向量,并且调用了指针的析构函数。 指针没有析构函数,所以什么也不会发生。

删除所有内容的一种方法是手动执行类似

while (!vec.empty())
{
    delete vec.back();
    vec.pop_back();
}

已经有很多好的答案,但我会再添加一个:

使用来自Boost Pointer Container Libraryboost::ptr_vector ,而不是 std::vector。 当 vector 超出 scope 时,它将删除对象,从而调用析构函数。

获取 Boost 库,在上面任何有原始指针的地方,都可以使用 boost::shared_ptr<> 代替。 (好吧,不在 main() 的签名中。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM