C++ 指针数组和其他东西
下面的代码演示了一个“指针数组”(我想) 现在,让我们假设它们不是C++ 指针数组和其他东西,c++,arrays,pointers,C++,Arrays,Pointers,下面的代码演示了一个“指针数组”(我想) 现在,让我们假设它们不是ints,而是您创建的对象类的一种类型 因此,我想从这个数组中删除一个成员(即,通过delete关键字调用其析构函数并销毁对象,但指针保持正常) 如果我的怀疑是正确的,那是不可能的,我唯一的选择是将数组的内容复制到一个新数组(我要删除的数组除外),然后删除以前的数组(作为一个整体及其所有元素),同时将新数组指定给指针数组 如果有人能证实或纠正我的怀疑,我将不胜感激,特别是因为“指针数组”这个名字太容易引起误解了。谢谢。据我所知,您
int
s,而是您创建的对象类的一种类型
因此,我想从这个数组中删除一个成员(即,通过delete关键字调用其析构函数并销毁对象,但指针保持正常)
如果我的怀疑是正确的,那是不可能的,我唯一的选择是将数组的内容复制到一个新数组(我要删除的数组除外),然后删除以前的数组(作为一个整体及其所有元素),同时将新数组指定给指针数组
如果有人能证实或纠正我的怀疑,我将不胜感激,特别是因为“指针数组”这个名字太容易引起误解了。谢谢。据我所知,您的问题无法解决,原因有二:
array[1] = NULL;
如果我理解正确。假设你有一门课
Foo
Foo a;
这是Foo对象的一个实例。它是在堆栈上分配的。当它们超出范围时,它将立即被破坏
Foo* a = new Foo(); // Allocated - Constructor called.
delete a; // Freed - Destructor called.
如果希望能够显式销毁对象,请在堆上分配它
Foo* a = new Foo(); // Allocated - Constructor called.
delete a; // Freed - Destructor called.
要记住的一个好规则是,对于每一个新的都应该有一个匹配的删除,不多也不少。
在您的示例中,您没有使用新的关键字,因此删除关键字没有位置
Foo* array[3];
是Foo
对象指针的堆栈上的数组。它们没有指向任何东西,它们是未初始化的。此阵列超出范围时将被销毁。请记住,它只会破坏作为指针的内容,不会试图释放它们指向的任何内容
array[0] = new Foo();
数组现在保存一个指向堆上Foo
对象的指针。它还包含2个未初始化的指针。如果让array
超出范围,将导致内存泄漏。要防止出现这种情况,必须释放Foo
对象
delete array[0];
array[0] = NULL;
将未初始化或已删除的指针设置为NULL也是一种很好的做法。通过这种方式,您可以明确地看到它没有指向任何内容。您现在可以执行如下检查:
if(array[0])
{
// We know there is an object here, since it's not NULL.
delete array[0];
array[0] = NULL; // Helps prevent trying to free memory more than once.
}
这样做,您不需要删除
,也可以尝试。不,删除主“数组”只会删除数组,指针将保持不变。这实际上是导致内存泄漏的原因,在大多数情况下,人们忘记了使用指针数组需要循环并删除每个元素中的内存。(除非您使用“delete[]array”,否则也会删除内容)如果std::vector
和std::vector::erase
不起作用,您想做什么?@U8如果您有new[]
ed指针的ed数组,delete[]
ing数组不会delete
指针。指针和对象的基本处理由所有人描述。因此,如果元素位于堆栈中,如果我总是添加和删除新项,如何避免堆栈溢出?非常感谢。这当然澄清了很多。很多,太好了!看起来你的评论部分有点疯狂了。很高兴我能帮忙。