【问题标题】:Segmentation fault while using delete in c++在 C++ 中使用删除时出现分段错误
【发布时间】:2014-04-27 02:03:15
【问题描述】:

我在尝试删除指针(对于 char 数组)时遇到段错误。请帮我。我在这里做错什么了吗。请在下面找到代码 sn-p 和输出。

代码:

# 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* 变量的正确方法是什么?

提前致谢。

【问题讨论】:

  • 在使用 C++ 编程时,您应该阅读并学习使用 standard library,它将对您有很大帮助。例如,不要对字符串使用指针,而应使用std::string

标签: c++ linux pointers char constants


【解决方案1】:

您正在使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;
}

【讨论】:

  • 这应该是 delete [] c.
【解决方案2】:

你在这里分配内存并将它分配给指针c

const char* c = new char[100];

但是然后你重新分配指针:

c = " hello";

这意味着您丢失了原始指针,现在c 指向您无法删除的文字字符串"hello"

您应该改为将copy 字符串放入分配的内存中。

【讨论】:

  • 如果我不对字符数组使用 new 和 delete ,是不是内存泄漏?我不能在我的代码中使用字符串,那么使用 const char* 变量的正确方法是什么?
  • @user2599593 您可以将c 声明为普通字符数组(例如char c[100];),这将是同样的事情,但您不必释放内存(它由编译器)。但是,您仍然必须将文字字符串复制到数组中。
【解决方案3】:
c = " hello";

使其指向您无法控制的静态 const char 缓冲区(字符串文字)。它不会复制数组中的字符串。在这种内存上调用 delete 时,您会崩溃。

您也永远无法释放最初分配的内存。

如果你想这样做:

delete [] c;

是你需要的。

【讨论】:

    【解决方案4】:

    您的代码试图删除只读数据部分中的变量,因此出现分段错误。 并且代码还包含内存泄漏,c = new char[100] 导致分配 100 个字节,然后 c 指针指向“hello”字面量,因此使用 new 接收的地址丢失,因此内存泄漏.. 使用字符串复制函数将文字“hello”复制到分配的内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-11
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2013-04-03
      • 2016-09-15
      • 2020-11-21
      相关资源
      最近更新 更多