删除指针时出错
Error when deleting a pointer
我正在开始,有些东西我不明白指针。我有以下代码返回一个我不知道为什么的错误:
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
。这不是一个好主意,尤其是在操作更复杂的数据类型时。
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 将链表转换为指针数组时出错
- 尝试将指针与结构一起使用时出错
- 将类指针类型转换为键时出错
- 如果我在指针中使用 ++ 操作数,我的值就会出错
- 在 Clang 中使用指向成员的指针时出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 通过在迭代指针键映射上出错来捕获非确定性
- 调用指向成员函数的指针时出错
- 通过具有矢量基址的指针读取矢量元素时出错
- 尝试返回指向 Visual Studio 中的动态数组的指针时出错C++
- 将空间分配给整数指针时出错
- GNU 链接器:如果头文件中的指针被声明为 NULL 和/或 extern,则出错
- 尝试将结构指针传递给类时出错
- 我设计了一个类并创建了基指针,但是当我尝试通过基指针访问派生函数时,它会出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 在使用C (Microsoft vs)中使用指针和新运算符时出错
- 将数组指针传递到函数时出错
- C++将指针数组传递给函数指针数组时出错
- 删除时出错:表达式必须是指向完整对象类型的指针