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

C++ 当我删除指针的指针时会发生什么?,c++,pointers,vector,C++,Pointers,Vector,我有一个向量,像std::vector myVector我想删除向量中的一个元素,而不改变其他元素的位置。我该怎么做?我有两种解决方案,告诉我它们是否好: AnyObject* initial; std::vector<AnyObject*> myVector(10, initial); AnyObject* object = myVector.at(4); delete object; 稍后,我不需要这个子采样点云,所以我将删除所有这些,除非子云与原始云的大小相同。 当然,在这两

我有一个向量,像
std::vector myVector
我想删除向量中的一个元素,而不改变其他元素的位置。我该怎么做?我有两种解决方案,告诉我它们是否好:

AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
AnyObject* object = myVector.at(4);
delete object;
稍后,我不需要这个子采样点云,所以我将删除所有这些,除非子云与原始云的大小相同。
当然,在这两种情况下,
SubsampledPointCloud
继承了
PointCloud
的一个分段错误,因为您实际上没有创建任何对象,只有空指针的向量

通常,如果有指向对象的指针向量,则可以通过如下方式删除对象,然后将指针设置为null,以表示它不指向对象

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

AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
delete myVector[4];
myVector[4] = 0;
AnyObject*首字母;
std::向量myVector(10,首字母);
删除myVector[4];
myVector[4]=0;
std::vector myVector(10,首字母);
此语句将使用10
initial
对象初始化向量
initial
是内存引用,当您
delete
时,它将解除分配给
initial
对象的内存,并使所有向量元素在这两种情况下都指向无效的内存位置。如果在这两种情况下都尝试在删除后访问它,则行为将是未定义的

我有两个解决方案,告诉我它们是否好

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

我是在删除向量中的指针还是仅仅删除对象


您只是在删除对象,指针的值将与对象所在的内存中的值完全相同。

您的前提有缺陷。您不应该使用原始指针来处理对象生命周期,而应该使用
std::unique\u ptr
(或者
std::shared\u 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);
std::vector myVector(10,nullptr);
//其他代码
myVector[索引]=使_唯一(args;
//其他代码
myvector[其他索引].reset(nullptr);

你可以这样做,但是向量中留下了一个无效的指针,我会说,可能不是很好,但也不是非法的(显然你应该像一些程序员说的那样初始化
initial
)。既然你没有初始化
initial
,那么向量中的所有元素都将具有相同的不确定值,一个您不能
删除的
。如果您想用十个空指针初始化向量,只需让它们默认初始化(通过执行例如
std::vector myVector(10);
)。哦,如果您初始化
initial
,那么所有十个元素都将指向相同的内存,这意味着如果
delete
一个指针,那么所有其他指针都将无效。最后,如果使用指针,则必须记住
delete
不会修改实际指针本身,因此如果
delete
向量中的指针,它将不会自动设置为
nullptr
,而是保留其(现在无效)值。听起来像是一个。你真正想要实现的是什么?如果指针在使用后会消亡,为什么要使用指针而不是实际对象呢?对于多形性?你能给我们一些上下文,一些有意义的名字,比如Car或Student吗?为什么不使用shared_ptr或unique_ptr?“只有空指针的向量。”这是不正确的,如果是真的,删除第五个元素是安全的。
initial
不是
nullptr
。而且,
delete nullptr
是完全有效的。@Gill Bates:是的,这是一个未初始化指针的向量。我太马虎了。我的观点是,删除未初始化的指针是不安全的,我在segfault注释中提到了这一点。是的,我没有看到这一点,但如果向量中的元素都不同,会发生什么?在这种情况下,它将产生相同的影响,即您删除的是对象而不是指针。它将使该向量元素指向无效的内存位置。如果删除一个指针,即向量的一个元素,则如果其他元素不指向相同的内存位置,则不会对它们产生影响
AnyObject* initial;
std::vector<AnyObject*> myVector(10, initial);
delete myVector[4];
myVector[4] = 0;
std::vector<AnyObject*> myVector(10, initial);
std::vector<std::unique_ptr<AnyObject> > myVector(10, nullptr);
// other code
myVector[index] = make_unique<AnyObject>(args...);
// other code
myvector[other_index].reset(nullptr);