3

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

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

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);
        }
};

wherea总是指向对象的指针dynamic_array

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

delete[] dynamic_array;

即使这样做了,是否需要删除向量中的每个指针?如果有必要,我可以在析构函数中这样做Class B吗?

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

4

4 回答 4

4

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

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

于 2013-08-14T12:36:09.330 回答
3

您存储在您的指针中的指针指向vector<CPoint*>您已经deleted使用delete[] dynamic_array指令的对象,因此您不必也不应该delete在存储在向量中的各个指针上添加指令。

于 2013-08-14T12:39:40.770 回答
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[]

于 2013-08-14T12:50:40.340 回答
0

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

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

于 2013-08-14T13:27:41.117 回答