当我删除指针指针时会发生什么?

时间:2017-03-08 15:34:15

标签: c++ pointers vector

我有一个像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

4 个答案:

答案 0 :(得分:0)

两种情况下的分段错误,因为您实际上没有创建任何AnyObjects,只有空指针的向量。

通常,如果你有一个指向对象的指针向量,你可以通过删除对象来删除对象,然后将指针设置为null,表示它没有指向一个对象。宾语。

使用您的示例,掩盖您尚未创建任何对象的事实:

AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
delete myVector[4];
myVector[4] = 0;

答案 1 :(得分:0)

std::vector<AnyObject*> myVector(10, initial);

此语句将使用10 initial个对象初始化vector。 initial是内存引用,当你delete释放为initial对象分配的内存时,会使所有向量元素都指向无效的内存位置。如果在两种情况下都尝试在删除后访问它,则行为将是未定义的。

答案 2 :(得分:0)

  

我有两个解决方案,告诉我他们是不是很好

您的两个解决方案都有UB - 您从未初始化的变量initial中读取。如果你设法将正确初始化的指针放到你的向量上,那么两个变量都会产生相同的效果 - 如果向量中的第五个指针不等于nullptr,它指向的对象将被破坏并释放内存。您应该理解delete不会修改传递给它的参数,因此调用delete不会改变指针本身,除非它不等于nullptr,否则您将在向量中留下悬空指针。重新分配新价值或在此之后避免使用它将是你的工作。或者从矢量调用矢量方法中删除它。

  

我是否也删除了向量中的指针或仅删除对象?

您只是删除对象,指针将具有完全相同的值,即指向曾经是对象的内存。

答案 3 :(得分:0)

你的前提是有缺陷的。您不应该使用原始指针来处理对象生命周期,如果生命周期真的是共享,请使用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);