在c ++中使用delete时出现分段错误

时间:2014-03-20 10:01:20

标签: c++ linux pointers char const

我在尝试删除指针时遇到了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的正确方法是什么?

提前致谢。

4 个答案:

答案 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”复制到分配的内存中。