我在尝试删除指针时遇到了seg错误(对于char数组)。请帮我。我在这里做错了什么。请在下面找到代码段和输出。
代码:
# include <iostream>
using namespace std;
int main()
{
int *p = new int;
const char* c = new char[100];
c = " hello";
*p = 10;
cout << "c= " << c << "*p = " << *p << endl;
delete p;
delete c;
c = NULL;
p = NULL;
return 0;
}
输出:
c= hello*p = 10
Segmentation fault (core dumped)
编辑:
如果我不为字符数组使用new和delete,那是否是内存泄漏?我不能在我的代码中使用字符串,那么使用const char * variable的正确方法是什么?
提前致谢。
答案 0 :(得分:6)
您分配内存并将其分配给指针c
此处
const char* c = new char[100];
但是然后你重新分配指针:
c = " hello";
这意味着您松开了原始指针,现在c
指向您无法删除的文字字符串"hello"
。
您应该将copy字符串放入已分配的内存中。
答案 1 :(得分:4)
您正在c
指向字符串文字:
c = " hello";
然后你试图删除它
delete c;
这是未定义的行为。并且您将数组c
指针泄漏到最初。
注意:如果c
指向原始动态分配的数组,则需要通过调用delete []
而不是delete
来删除它。此外,在C ++中,您通常会避免这种手动内存分配:
#include <string>
#include <iostream>
int main()
{
std::string c = "hello";
int p = 10;
std::cout << "c= " << c << ", p = " << p << std::endl;
}
答案 2 :(得分:2)
c = " hello";
使其指向您无法控制的静态const char缓冲区(字符串文字)。它不会复制数组中的字符串。在这种内存上调用delete时,就会崩溃。
您也永远无法释放最初分配的内存。
如果你想这样做:
delete [] c;
是你需要的。
答案 3 :(得分:0)
您的代码正在尝试删除只读数据部分中的变量,因此会出现分段错误。
并且代码还包含内存泄漏,c = new char[100]
导致分配100个字节,然后c指针指向“hello”文字,因此使用new接收的地址丢失,因此内存泄漏..
使用字符串复制功能将文字“hello”复制到分配的内存中。