operator=赋值后为什么删除char数组导致崩溃?
Why delete char array cause crash after assign a value by operator=?
这是我的代码。我创建了一个 char 数组,并通过 operator= 为其分配了一个字符串文字。之后,我通过 delete.However 释放它,它导致分段。但它适用于 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;
}
你动态分配了一个字符数组
char* a=new char[3];
在这条语句之后指针a
指向动态分配的内存。
但是你重新分配了指针
a="12";
所以分配内存的地址丢失了。并且代码会产生内存泄漏。现在指针指向具有静态存储持续时间的字符串文字 "12"
的第一个字符。并且您正在尝试使用未动态分配的静态持续时间释放此内存。
delete[] a;
所以出现错误。
例如,您应该使用标准字符串函数 strcpy
将字符串文字复制到分配的内存范围内。
strcpy( a, "12" );
这两种说法的区别
a = "12";
和
strcpy( a, "12" );
是在第一条语句中,您正在更改存储在指针 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 数组,并通过 operator= 为其分配了一个字符串文字。之后,我通过 delete.However 释放它,它导致分段。但它适用于 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;
}
你动态分配了一个字符数组
char* a=new char[3];
在这条语句之后指针a
指向动态分配的内存。
但是你重新分配了指针
a="12";
所以分配内存的地址丢失了。并且代码会产生内存泄漏。现在指针指向具有静态存储持续时间的字符串文字 "12"
的第一个字符。并且您正在尝试使用未动态分配的静态持续时间释放此内存。
delete[] a;
所以出现错误。
例如,您应该使用标准字符串函数 strcpy
将字符串文字复制到分配的内存范围内。
strcpy( a, "12" );
这两种说法的区别
a = "12";
和
strcpy( a, "12" );
是在第一条语句中,您正在更改存储在指针 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
本身。这是关键的区别。
当你使用指针时,你必须理解改变指针和改变指针指向的任何东西之间的区别。这是两个不同的东西。