【问题标题】:Why delete char array cause crash after assign a value by operator=? [duplicate]为什么用operator=赋值后删除char数组会导致崩溃? [复制]
【发布时间】:2021-05-23 03:09:24
【问题描述】:

这是我的代码。我创建一个 char 数组并通过 operator= 为其分配一个字符串文字。之后,我通过删除释放它。但是,它会导致分段。但它适用于 strcpy。另外,char数组总是由strcpy分配的吗?

我从 STL std::string 的实现中遇到了这个问题,我想知道为什么 private char* _data 总是由 strcpy 分配,不能由 operator=? 分配,因为 char* A= "HELLO WORLD" 也可以。

int main()
{
    char* a=new char[3];
    a="12";
    //strcpy(a,"aa");
    delete[] a;

}

【问题讨论】:

  • a 是一个指针,a="12"; 将其设置为指向字符串文字,而不是之前指向的任何内容。它不会将字符串复制到您分配的数组中,它只是将指针更改为指向文字。
  • 如果你想创建自己的 std::string 替代品,你需要一个合适的 class,然后使用 operator= 覆盖。

标签: c++ delete-operator stdstring strcpy


【解决方案1】:

你只能delete[] 分配给new[] 的东西。

所以这段代码没问题,因为a指向你用new[]分配的内存

int main()
{
    char* a = new char[3];
    delete[] a;
}

这段代码也可以,因为a仍然指向用new[]分配的内存

int main()
{
    char* a=new char[3];
    strcpy(a, "aa"); // this doesn't change a
    delete[] a;
}

但这段代码不同。在这段代码中,a 开始指向使用new[] 分配的内存,但随后您更改指针。你让a指向"aa"。那不是用new[] 分配的内存,所以你会崩溃。

int main()
{
    char* a=new char[3];
    a = "aa"; // this does change a
    delete[] a;
}

第二版和第三版的区别在于第二版改变了a指向的字符,而第三版改变了a本身的指针。这是关键的区别。

当您使用指针时,您必须了解更改指针和更改指针指向的任何内容之间的区别。这是两个不同的东西。

【讨论】:

    【解决方案2】:

    你动态分配了一个字符数组

    char* a=new char[3];
    

    在此语句之后,指针a 指向动态分配的内存。

    但是你重新分配了指针

    a="12";
    

    所以分配的内存地址丢失了。并且代码会产生内存泄漏。现在指针指向具有静态存储持续时间的字符串文字"12" 的第一个字符。您正在尝试使用未动态分配的静态持续时间来释放此内存。

    delete[] a;
    

    所以错误发生了。

    您应该使用例如标准字符串函数strcpy 将字符串文字复制到分配的内存范围中。

    strcpy( a, "12" );
    

    这两种说法的区别

    a = "12";
    

    strcpy( a, "12" );
    

    是在第一个语句中,您正在更改存储在指针a 中的值。也就是说,在这样的语句之后,指针指向具有另一个地址的另一个内存范围。

    在第二个语句中,指针本身没有被改变。指针所指向的内存范围正在被更改。指针保持其值不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      相关资源
      最近更新 更多