【问题标题】:Is this the right way to delete an array in a destructor?这是在析构函数中删除数组的正确方法吗?
【发布时间】:2017-03-19 18:09:44
【问题描述】:

希望你们今天过得愉快! 所以我想创建一个将单词(字符串)保存为字符数组的类。 我在默认构造函数中为str分配了内存,不知道是不是这样。

`   #include <iostream>
    using namespace std;
    class String{
      private:
      char *str;
      public:
      String(){
        str=new char[10];
        str="Hello";
      }
      void getstr(){
        for (int i=0;i<5;i++){
          cout<<str[i];
        }
      }
      ~String(){
        delete []str;
      }
    };
    int main(){
      String s1;
      s1.getstr();
      return 0;
    }

当我运行这个程序时,它会打印“Hello”,但这是确切的输出:

*** Error in `./main': free(): invalid pointer: 0x0000000000400ab5 ***
Hello

当我删除析构函数部分时,它工作正常,但我需要释放分配给 str 的内存,对吗?有什么帮助吗?

提前致谢:)

【问题讨论】:

  • 也许使用std::string?这个str="Hello";也没有意义
  • char str[100]; 之后是 str=new char[10];,然后,令人惊讶的是,str="Hello";。这是怎么回事?
  • @ForceBru 问题里不小心写了str[100],编译的时候居然是*str

标签: c++


【解决方案1】:
    str=new char[10];
    str="Hello";

第一行分配了一个新的char 数组,该数组可以容纳 10 个字符(或 9 个字符和一个空字节)。然而,第二行将指针str 设置为字符串文字"Hello" 的地址。因此,当您调用delete [] 时,您正在尝试释放指向字符串文字的指针,而不是指向某些动态分配的内存的指针。如果你希望你的字符串被动态分配,你应该复制你的字符串(最好使用strcpy),或者只使用std::string,它会为你处理内存管理。

【讨论】:

  • 我想在不使用“字符串”的情况下这样做。有什么办法可以做到吗?
  • @Zarish 答案就在那里:“你应该复制你的字符串(最好使用 strcpy)”
  • @Zarish - 在修复构造函数之后,您还应该考虑添加一个复制构造函数和一个赋值运算符。否则你很快就会得到“双重删除”错误。 (或者只使用 std::string 来处理所有事情 :-)。
  • 另外,如果你使用的是 C++……那为什么不想使用字符串呢?它没有任何错误或缓慢。
猜你喜欢
  • 2012-05-03
  • 2020-04-17
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多