Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么删除字符数组会在运算符为赋值后导致崩溃=?_C++_Delete Operator_Stdstring_Strcpy - Fatal编程技术网

C++ 为什么删除字符数组会在运算符为赋值后导致崩溃=?

C++ 为什么删除字符数组会在运算符为赋值后导致崩溃=?,c++,delete-operator,stdstring,strcpy,C++,Delete Operator,Stdstring,Strcpy,这是我的密码。我创建了一个char数组,并通过操作符=,为其分配一个字符串文字。之后,我通过删除来释放它。但是,它会导致分割。但它可以与strcpy配合使用。此外,字符数组是否总是由strcpy赋值 我是从STL std::string的实现中遇到这个问题的,我想知道为什么strcpy总是分配私有字符*\u数据,它不能分配给操作符=?,因为char*A=“HELLO WORLD”也可以工作 int main() { char* a=new char[3]; a="12&

这是我的密码。我创建了一个char数组,并通过操作符=,为其分配一个字符串文字。之后,我通过删除来释放它。但是,它会导致分割。但它可以与strcpy配合使用。此外,字符数组是否总是由strcpy赋值

我是从STL std::string的实现中遇到这个问题的,我想知道为什么strcpy总是分配
私有字符*\u数据
,它不能分配给
操作符=?
,因为
char*A=“HELLO WORLD”
也可以工作

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

}

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

char* a=new char[3];
在该语句之后,指针
a
指向动态分配的内存

但是你重新分配了指针

a="12";
因此,分配内存的地址丢失。代码会产生内存泄漏。现在,指针指向具有静态存储持续时间的字符串literal
“12”
的第一个字符。您正试图以未动态分配的静态持续时间释放此内存

delete[] a;
因此错误发生了

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

strcpy( a, "12" );
这两种说法的区别是什么

a = "12";

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


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

您只能
删除[]
使用
新建[]
分配的内容

所以这个代码是可以的,因为
a
指向您用
new[]分配的内存。

int main()
{
    char* a = new char[3];
    delete[] a;
}
int main()
{
    char* a=new char[3];
    strcpy(a, "aa"); // this doesn't change a
    delete[] a;
}
此代码也可以,因为
a
仍然指向分配给
new[]的内存。

int main()
{
    char* a = new char[3];
    delete[] a;
}
int main()
{
    char* a=new char[3];
    strcpy(a, "aa"); // this doesn't change a
    delete[] a;
}
但是这个代码是不同的。在这段代码中,
a
开始指向用
new[]
分配的内存,但随后您更改指针。您在
“aa”
处创建
a
点。这不是分配给
new[]
的内存,因此会发生崩溃

int main()
{
    char* a=new char[3];
    a = "aa"; // this does change a
    delete[] a;
}
第二个版本和第三个版本的区别在于,第二个版本更改了
a
指向的字符,但第三个版本更改了指针
a
本身。这就是关键的区别


使用指针时,必须理解更改指针和更改指针指向的对象之间的区别。这是两个不同的东西。

a
是指针,而
a=“12”
将其设置为指向字符串文字,而不是它之前指向的任何内容。它不会将字符串复制到您分配的数组中,它只是将指针改为指向文本。如果您试图创建自己的
std::string
替代方案,则需要一个适当的
,然后使用带有覆盖的
运算符=