代码之家  ›  专栏  ›  技术社区  ›  DaClown

删除char数组

  •  26
  • DaClown  · 技术社区  · 17 年前

    这个问题与 this one .给定此代码:

    char *p = new char[200];
    delete[] p;
    

    如果你设定,会发生什么 p[100] = '\0'

    6 回复  |  直到 9 年前
        1
  •  42
  •   anon anon    17 年前

    代码:

    char *p = new char[200];
    p[100] = '\0';
    delete[] p;
    

    是完全有效的C++。delete不知道也不关心以null结尾的字符串,所以你的错误一定是其他原因造成的。

        2
  •  8
  •   Johannes Schaub - litb    17 年前

    然后,您将释放分配的内存。编译器将完全按照我们的预期处理它。由其分配的内存与以null结尾的字符串完全无关。你可以把你想要的一切都放进记忆里。这是一些“原始”存储块,您甚至可以在该内存中创建一些任意的C++对象(新位置)。

    你的bug在别处。例如,一些常见的错误是这样的,构造函数被调用一次,但析构函数被调用两次,双重删除了一些东西:

    struct A { P *p; A() { p = new P; } ~A() { delete p; } };
    A getA() { return A(); } int main() { A a = getA(); }
    

    现在,默认构造函数被调用一次,创建的对象被复制零次或多次。但是析构函数会为创建的每个副本运行。因此,您将多次调用指针上的析构函数,从而导致这种奇怪的错误。正确的修复方法 就是使用智能指针,比如 shared_ptr 作为练习,您也可以不使用它,通过编写适当的复制构造函数来复制对象并在复制构造函数中分配内存,以便副本和相应的原始对象保持不同的指针。

        3
  •  6
  •   JaredPar    17 年前

    我认为你把一个普通的旧char数组和一个表示C风格字符串的char数组混淆了。C++delete运算符对C风格字符串数组毫不关心。它只会看到一个字符数组。这和删除一个int数组没有什么不同。

    空终止符的存在与否仅与处理 char*

        4
  •  3
  •   aJ.    17 年前

    这应该没关系。delete[]应用于删除动态分配的数组,而不管其内容如何。

        5
  •  1
  •   Dima    17 年前

    据我所知,这应该很好。你分配了一块内存,操作系统应该跟踪它,并在被要求时能够释放它。将什么值放入已分配的缓冲区中根本不重要。

    在字符数组中间粘贴NULL肯定会干扰C字符串函数,例如 strcmp , strlen

        6
  •  0
  •   Joey Gumbo    17 年前

    错误可能是由更改的值引起的 p