Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针数组和其他东西_C++_Arrays_Pointers - Fatal编程技术网

C++ 指针数组和其他东西

C++ 指针数组和其他东西,c++,arrays,pointers,C++,Arrays,Pointers,下面的代码演示了一个“指针数组”(我想) 现在,让我们假设它们不是ints,而是您创建的对象类的一种类型 因此,我想从这个数组中删除一个成员(即,通过delete关键字调用其析构函数并销毁对象,但指针保持正常) 如果我的怀疑是正确的,那是不可能的,我唯一的选择是将数组的内容复制到一个新数组(我要删除的数组除外),然后删除以前的数组(作为一个整体及其所有元素),同时将新数组指定给指针数组 如果有人能证实或纠正我的怀疑,我将不胜感激,特别是因为“指针数组”这个名字太容易引起误解了。谢谢。据我所知,您

下面的代码演示了一个“指针数组”(我想)

现在,让我们假设它们不是
int
s,而是您创建的对象类的一种类型

因此,我想从这个数组中删除一个成员(即,通过delete关键字调用其析构函数并销毁对象,但指针保持正常)

如果我的怀疑是正确的,那是不可能的,我唯一的选择是将数组的内容复制到一个新数组(我要删除的数组除外),然后删除以前的数组(作为一个整体及其所有元素),同时将新数组指定给指针
数组


如果有人能证实或纠正我的怀疑,我将不胜感激,特别是因为“指针数组”这个名字太容易引起误解了。谢谢。

据我所知,您的问题无法解决,原因有二:

  • 您将无法删除这些元素(int或A),因为它们位于堆栈上,而不是堆中,超出范围时将自动删除它们
  • 删除或移动数组不会像上面所说的那样删除其元素
  • 至于“擦除数组[1]的内容”,可以通过以下方式完成:

    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
    指针。指针和对象的基本处理由所有人描述。因此,如果元素位于堆栈中,如果我总是添加和删除新项,如何避免堆栈溢出?非常感谢。这当然澄清了很多。很多,太好了!看起来你的评论部分有点疯狂了。很高兴我能帮忙。