我刚开始,有一些我用指针不明白的东西。 我有以下代码返回错误,我不知道为什么:
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;
答案 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
。这不是一个好主意,特别是当你来操作更复杂的数据类型时。