用operator=赋值后,为什么删除char数组会导致崩溃?

问题描述

这是我的代码。我创建了一个 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;

}

解决方法

你只能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本身。这是关键的区别。

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

,

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

char* a=new char[3];

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

然后你重新分配了指针

a="12";

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

delete[] a;

所以错误发生了。

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

strcpy( a,"12" );

这两种说法的区别

a = "12";

strcpy( a,"12" );

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

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