【问题标题】:Deleting dynamic array of char in C++在 C++ 中删除 char 的动态数组
【发布时间】:2010-05-04 17:14:48
【问题描述】:

我有这门课,属性是“单词”

class Node {
    char *word;

在 Node 构造函数中,我做了这个赋值:

word = new char[strlen(someword)];

在Node类的析构函数中,我尝试删除word指向的内容:

delete []word;

执行程序后我得到下一条消息:

“003E4F48 处的堆块在 003E4F51 处修改后请求大小为 1”

我哪里做得不好?

【问题讨论】:

    标签: c++ arrays char


    【解决方案1】:

    您的程序中存在缓冲区溢出,在您未发布的代码中的其他地方。问题是您没有分配足够的内存——您没有为字符串末尾的空终止符留出空间。您应该将分配更改为:

    word = new char[strlen(someword) + 1];  // +1 for null terminator
    ...
    strcpy(word, someword);
    

    你应该庆幸你的 C 运行时发现了你的错误。在大多数情况下,一个字节的缓冲区溢出将导致无声的内存损坏,并且直到很久以后才会被检测到,如果有的话。

    您还应该考虑使用std::string 类,它会自动为您管理内存,因此您不必处理此类微妙的问题。

    【讨论】:

      【解决方案2】:

      strlen 将返回字符串的长度,但不会考虑以空值结尾的额外字节。我的猜测是,您随后复制了一个字符串并附加了一个空字节,但您在最初分配内存时并没有考虑到它。尝试将代码更改为:

      word = new char[strlen(someword) + 1];
      

      【讨论】:

        【解决方案3】:

        您有一个损坏的堆-您在代码中的其他地方在分配的内存之外编写或删除了您不应该删除的内容-您确定您不是指 strlen(someword) + 1?这个问题的最佳解决方案是使用 std:;string 或 std::vector 而不是动态数组。

        【讨论】:

          猜你喜欢
          • 2018-04-07
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          • 2018-10-02
          相关资源
          最近更新 更多