删除指针时出错

时间:2012-06-20 12:29:46

标签: c++ pointers delete-operator

我刚开始,有一些我用指针不明白的东西。 我有以下代码返回错误,我不知道为什么:

std::string key = "myKey";    
const unsigned char* aesKey = reinterpret_cast<const unsigned char *> (key.c_str());

// Executing some stuffs

delete aesKey;

第一次代码执行一切正常,但第二次我得到一个错误,如果我没有delete行我不会得到(相反,我有内存泄漏,相当糟糕)。

有人可以解释一下为什么这不起作用?

下面的示例在相同的上下文中工作正常(相同的方法,...)

unsigned char* test = new char;
//doing some stuff
delete test;

5 个答案:

答案 0 :(得分:7)

首先:你没有那个C字符串,所以它不属于delete[]std::string仍然拥有它,之后会delete[]

使用delete[]删除

第二个数组,而不是delete。所以你无论如何都在使用错误的操作员。

答案 1 :(得分:2)

std::string::c_str返回的内存继续由字符串拥有,因此它不应该是delete d。

您只应在delete版的内存上拨打new,并且不应使用new

答案 2 :(得分:1)

您不应删除从c_str()收到的数据。它指向字符串的内部位置,它取决于字符串以删除它

答案 3 :(得分:1)

您不应该删除通过std::string::c_str()返回的指针。要记住的一个好的经验法则是:如果没有为指针分配内存,则不应该取消分配它。见标准:

  

21.4.7.1 basic_string访问者

 const charT* c_str() const noexcept;
 const charT* data() const noexcept;
  

1 返回:指针p,使得[0,size()]中每个i的p + i ==&amp;运算符。

     

2 复杂性:恒定时间。

     

3 需要:程序不得更改存储在字符数组中的任何值。

答案 4 :(得分:0)

快速笔记:

在第一个示例中,您将删除尚未分配的内存。 aesKey的内容属于字符串key,您不应删除它们......如果没有别的,当key超出范围时被销毁,它将尝试删除同一块内存,你会得到一个令人讨厌的双删除错误。

在您的第二个示例中,您创建的是char,但指定的是unsigned char。这不是一个好主意,特别是当你来操作更复杂的数据类型时。