我在这个论坛上已经阅读了很多关于指针向量的内容,但却没有理解删除存储在向量中的指针的想法。以下是我的询问:
假设我动态创建一个对象数组
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 ++的新手,并且我的应用程序需要使用容器。
答案 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)的无用指针。