![](/img/trans.png)
[英]What happens when I call “delete” on an uninitialized pointer in C++?
[英]What happens when I delete a pointer of pointer?
我有一个像std::vector<AnyObject*> myVector;
并且我想删除向量中的一个元素而不更改其他元素的位置。 我怎样才能做到这一点 ? 我有两个解决方案,请告诉我它们是否很好:
AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
AnyObject* object = myVector.at(4);
delete object;
要么
AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
delete myVector.at(4);
当我删除object
时,第一个解决方案会发生什么? 我还要删除向量中的指针还是仅删除object
?
编辑:
当我写AnyObject* initial;
,我知道initial
尚未初始化,我只想说一下如果我有一个初始化指针的向量,并且如果我想删除一个指针而不更改其他指针的位置会发生什么。
EDIT2:
对于问题的上下文,我有一个类PointCloud
和另一个类SubsampledPointCloud
。 我希望对所有云进行最小大小相同的采样,因此在我的采样点云中,至少要有一个与点云大小相同的云。 因此,要建立我的矢量SubsampledPointCloud
,我有一个向量PointCloud
初始化的变量minPointCloudSize
等于我的点云中最小的尺寸和我这样做:
std::vector<SubsampledPointCloud*> subcloud(clouds.size());
for (std::size_t i = 0; i < clouds.size(); i++) {
if (clouds.at(i).size() > minPointCloudSize)
subcloud.at(i) = subPointCloud(clouds.at(i)); //subPointCloud is a function
//that return a SubsampledPointCloud*
else
subcloud.at(i) = clouds.at(i);
}
后来,我不需要此子采样点云,因此,除非子云的大小与原始云的大小相同,否则我将删除所有这些点云。 当然, SubsampledPointCloud
继承了PointCloud
。
在这两种情况下,都存在分段错误,因为您实际上并未创建任何AnyObject,而仅创建了空指针的向量。
通常,如果您有指向对象的指针向量,则可以通过删除对象来删除对象,方法是先删除对象,然后将指针设置为null,以表示它没有指向对象。
使用您的示例,掩盖您尚未创建任何对象的事实:
AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
delete myVector[4];
myVector[4] = 0;
std::vector<AnyObject*> myVector(10, initial);
该语句将使用10个initial
对象初始化向量。 initial
是内存引用,在delete
它时会取消分配为initial
对象分配的内存,这两种情况下都会使所有矢量元素指向无效的内存位置。 如果两种情况下都删除后尝试访问它,则行为将是不确定的。
我有两种解决方法,请告诉我它们是否很好
您的两个解决方案都具有UB-您可以从未初始化的变量initial
读取。 如果您设法将正确初始化的指针放置到向量上,则这两个变量将具有相同的效果-如果向量中的第五个指针不等于nullptr
,则它指向的对象将被销毁并释放内存。 您应该理解delete
不会修改传递给它的参数,因此调用delete不会更改指针本身,并且除非它不等于nullptr
,否则向量中将剩下悬挂的指针。 重新为其分配新值或避免在此之后使用它是您的工作。 或从向量调用向量方法中将其删除。
我还要删除向量中的指针还是仅删除对象?
您只删除对象,指针将具有完全相同的值,即指向内存中对象以前所在的位置。
您的前提有缺陷。 您不应该使用原始指针来处理对象的生存期,而应使用std::unique_ptr
(如果生存期确实是共享的 ,则应使用std::shared_ptr
)
然后你的例子看起来像
std::vector<std::unique_ptr<AnyObject> > myVector(10, nullptr);
// other code
myVector[index] = make_unique<AnyObject>(args...);
// other code
myvector[other_index].reset(nullptr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.