指针矢量:需要一些澄清

时间:2013-08-14 12:33:10

标签: c++ pointers vector dynamic-memory-allocation

我在这个论坛上已经阅读了很多关于指针向量的内容,但却没有理解删除存储在向量中的指针的想法。以下是我的询问:

假设我动态创建一个对象数组

CPoint* dynamic_array;
dynamic_array = new CPoint[30714];

我现在必须通过指针向量

在另一个类的对象中使用这些值
vector<CPoint*> vector_of_pointers;

然后,我将使用以下

dynamic_array的元素划分为另一个类的对象
Class B{
    vector<CPoint*> vector_of_pointers;
public:
    void function(CPoint* a){
        if (some condition){
            vector_of_pointers.push_back(a);
        }
};

a始终是指向dynamic_array

对象的指针

然后,我计划在对象的需求结束后删除最初创建的dynamic_array。

delete[] dynamic_array;

即使在执行此操作后,还是要删除向量中的每个指针吗?如果有必要,我可以在Class B的析构函数中执行此操作吗?

很抱歉,如果这是一个简单或愚蠢的问题,但我是c ++的新手,并且我的应用程序需要使用容器。

4 个答案:

答案 0 :(得分:4)

回答您的原始问题:不,您不需要删除单个CPoint个对象(事实上您不能删除)。

但我相信你最好使用vector<CPoint>来存储实际的点,而不是指向它的指针。

答案 1 :(得分:3)

您存储在vector<CPoint*>中的指针指向已使用deleted指令delete[] dynamic_array的对象,因此您不必添加{也不应添加{ {1}}关于存储在向量中的各个指针的说明。

答案 2 :(得分:0)

  

即使在执行此操作后,还是要删除向量中的每个指针吗?如果有必要,我可以在B类的析构函数中进行吗?

答案是否定的,事实上你不能。

使用std::vector是否更好我认为这取决于您的需求,但我可以确认使用new[]比单独创建每个对象要快得多。有时候:

class CPoint {
public:
    float x; float y;
}

const int N = 1e6;
for(int i = 0; i < N; ++i)
{
    new CPoint();
}
// 122 ms

CPoint* points = new CPoint[N];
// 0.00793176 ms

std::vector<CPoint*> vectorPoints(N); // same as above
// 4.48263 ms

使用std::vector<CPoint*>(N)也很快但速度不快new[]

答案 3 :(得分:0)

删除向量中指针指向的CPoint对象是不必要的,但是不可能,但必须从向量中删除向量中的指针。

你必须清除向量,因为它至少包含4 * number_of_elements(x64系统中8 * number_of_elements)的无用指针。