char *和删除问题

时间:2014-06-16 14:02:53

标签: c++ arrays pointers char delete-operator

尝试取消分配此指针时遇到了严重问题。

我遇到了这个错误:

  对象0x10007fd20的

错误:未分配的指针

我有以下结构:

char * doSomething() //I cannot change this method.
{
     return "hello world";
};
int main ()
{
  char * var= doSomething();
  cout<< var<<endl;
  delete[] var;
};

请注意我不能使用字符串,因为我没有收到doSomething method。因为我使用它很多..一段时间后应用程序因RAM内存使用而崩溃。

4 个答案:

答案 0 :(得分:4)

您正在尝试delete[]一个静态字符串。您只想使用delete[]创建的new[]个对象。

答案 1 :(得分:1)

您只能删除使用相应operator new分配的内容。字符串文字具有静态存储持续时间。它们不是动态分配的。根据C ++标准

  

8也引用普通的字符串文字和UTF-8字符串文字   作为窄字符串文字。窄字符串文字的类型为“数组”   of n const char“,其中n是下面定义的字符串的大小,   并且具有静态存储持续时间(3.7)。

答案 2 :(得分:0)

我发现了多个潜在问题:

  • 您在字符串文字上使用delete[],错误,这就是您收到错误的原因
  • 您正在将字符串文字转换为char*,这已被弃用并且不安全(因为您无法修改字符串文字)
  • 你正在返回一个指向局部变量的指针,在你的情况下这是允许的,因为你正在使用字符串文字,但一般来说

    int *function() { int x = 10; return &x; }

永远不应该这样做,如果你返回一个指向函数中某个东西的指针,请确保它是动态分配或静态分配但不在堆栈上分配。

答案 3 :(得分:0)

在我看来,字符串文字就像&#34; Hello world&#34;存储在程序的静态部分而不是堆栈中。这意味着,只有一个&#34; Hello world&#34;在内存中,无论你调用多少次函数。那些调用应该返回相同的地址。您的程序的RAM问题不是由此问题引起的。