释放容器成员的记忆

时间:2014-01-23 15:09:53

标签: c++ pointers memory delete-operator

我正在尝试清理我对C ++中一些内存问题的理解,主要是使用包含指针的容器。说我有这样的事情:

Header.H

#ifndef test_Header_h
#define test_Header_h

#include <vector>

using std::vector;

class ClassA {
    int* intPtr;

public:
    ClassA(int n);
    ~ClassA();
};

class ClassB {
    vector<ClassA*> vecPtr;

public:
    ClassB();
    ~ClassB();

    void someFunc();
};

#endif

的main.cpp

#include <iostream>
#include "Header.h"

int main(int argc, const char * argv[])
{
    ClassA objA(5);
    ClassB objB;

    return 0;
}

ClassA::ClassA(int n) {
    intPtr = new int[n];
}
ClassA::~ClassA() {
    delete intPtr;
}

ClassB::ClassB() {
    vecPtr = vector<ClassA*>(0);
}

ClassB::~ClassB() {
    //no destructor needed
}

void ClassB::someFunc() {
    //vecPtr = something using new;
    int* testPtr = new int[vecPtr.size()];
    //do stuff
    delete testPtr;
}

是否需要删除vecPtr?或者ClassA的析构函数是否为我完成了这个?另外,如果我使用了vector指针或list,那么如果不是pair,那么情况是否相同?最后,为了澄清testPtr需要在someFunc中删除,因为这是它声明的范围,因此将它放在析构函数中将毫无意义。如果testPtr共享一个重要成员的地址,删除它也是重要成员?我知道有很多问题,但我认为我只是在脑海中循环论证,让自己越来越困惑。

2 个答案:

答案 0 :(得分:2)

vecPtr不需要删除,因为它不是指针。这可能与vecPtr中的指针不同,取决于谁拥有这些指针的所有权。

是的,testPtr必须在可用的地方删除。其他任何东西都不会编译。如果您将testPtr指向某个成员并将其删除,则在析构函数中删除该成员时,您可能会看到双重释放或损坏错误。

一般情况下,必须删除的内容取决于实现。您需要注意的唯一事情是每个新​​的从任何代码路径中的某个位置获得一个删除。通常,构造函数/析构函数是一个好地方。

答案 1 :(得分:0)

你这里有很大的问题。记住这个:

1)任何new必须与delete平衡。

2)任何new[]必须与delete[]平衡。

事实上,如果你混合它们(正如你所做的那样),你就会有未定义的行为热潮!您需要撰写delete[] intPtr;delete[] testPtr;

另外,简单地说,你没有写delete vecPtr,因为你没有写new vecPtr

在内部,C ++运行时会记住使用new[]分配的元素数。您需要使用delete[]来允许该运行时访问该信息。