删除指针时出错

Error when deleting a pointer

本文关键字:出错 指针 删除      更新时间:2023-10-16

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

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;

首先:你不拥有那个 C 字符串,所以它不是你的delete[]std::string仍然拥有它,稍后会delete[]它。

第二:数组是用delete[]删除的,而不是delete的。所以无论如何你都用错了运算符。

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

您应该只在已new ed 的内存上调用 delete,并且不应使用 new

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

您不应该删除通过 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 == &运算符对于 [0,size()] 中的每个 i。

2 复杂度:恒定时间。

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

几个快速说明:

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

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