繁体   English   中英

删除指针的指针会怎样?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM