指针矢量:需要澄清
Vector of pointers: some clarification needed
我在这个论坛上读了很多关于指针向量的文章,但很难理解删除存储在向量中的指针的想法。以下是我的问题:
假设我动态地创建一个对象数组
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)的无用指针。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错