标签:c
请考虑以下代码:
int main()
{
char* str = new char;
str[0] = 'a';
delete[] str; //Notice the []
}
它编译,运行并且没有崩溃(VC15和g)
但它确实有1个内存泄漏,我可以用valgrind清楚地看到它.
但是,如果我运行以下代码:
#include <iostream>
class Foo{
public:
Foo(){
std::cout << "Foo::Foo" << std::endl;
}
~Foo(){
std::cout << "Foo::~Foo" << std::endl;
}
};
int main()
{
Foo* foo = new Foo;
delete[] foo;
return 0;
}
在Windows上运行时,我得到一个无限循环的析构函数调用,在Linux中运行一个无效的指针错误(在~20 d调用之后).
我无法弄清楚为什么两者之间存在差异?为什么我没有新的char或崩溃的无限循环?
解决方法:
你应该使用delete []和仅使用new []分配的指针;
问题
在您的第一个代码段中:
>使用语句char * str = new char;你得到一个指向单个字符的指针.所以new的类型匹配char *.
>但是你的delete []需要一个指向char数组的指针,所以当你删除不是数组的东西时会得到未定义的行为(UB)
第二个代码段具有完全相同的问题. UB未定义,可以给出奇怪和无法解释的结果.
怎么解决?
对单个元素分配使用单个元素delete:
Foo* foo = new Foo;
delete foo;
或者使用数组删除进行数组分配:
Foo* foo = new Foo[1];
delete[] foo;
或者更好:摆脱任何你想要使用的新/删除并使用向量而不是数组.
标签:c 来源: https://codeday.me/bug/20190823/1702609.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。