2

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

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;
4

5 回答 5

7

第一:你不拥有那个 C 字符串,所以delete[]. std::string仍然拥有它,以后会delete[]

第二:数组被删除delete[],而不是delete。因此,无论如何您都使用了错误的运算符。

于 2012-06-20T12:32:46.363 回答
2

由返回的内存std::string::c_str继续归字符串所有,所以它不应该是deleted。

你应该只调用delete你已经编辑的内存,你new不应该使用new.

于 2012-06-20T12:32:37.907 回答
1

您不应删除从 接收的数据c_str()。它指向字符串的内部位置,由字符串来删除它

于 2012-06-20T12:33:03.507 回答
1

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

21.4.7.1 basic_string 访问器

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

1返回:一个指针 p 使得 p + i == &operator 用于 [0,size()] 中的每个 i。

2复杂性:恒定的时间。

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

于 2012-06-20T12:34:33.520 回答
0

几个快速说明:

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

在您的第二个示例中,您正在创建一个char但分配给一个unsigned char. 这不是一个好主意,尤其是在您处理更复杂的数据类型时。

于 2012-06-20T12:34:39.127 回答