指针矢量:需要澄清

Vector of pointers: some clarification needed

本文关键字:指针      更新时间:2023-10-16

我在这个论坛上读了很多关于指针向量的文章,但很难理解删除存储在向量中的指针的想法。以下是我的问题:

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

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++的新手,使用容器对我的应用程序来说是必要的。

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

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

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

删除向量中的每个指针是否有必要?如果有必要,我可以在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[]

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

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