为什么我们需要重写terminate()
why we need to override terminate()?
我的c++程序出错了:
#include<iostream>
using namespace std;
char* foo()
{
char * mystr = new char[6];
mystr = "Hello";
return mystr ;
}
int main()
{
char* myString =foo();
printf("%s n", myString);
delete [] myString ;
}
==27472== Invalid free() / delete / delete[]
==27472== at 0x4A07A12: operator delete[](void*) (vg_replace_malloc.c:409)
==27472== by 0x4007EB: main (printHello.cpp:16)
==27472== Address 0x4008f8 is not stack'd, malloc'd or (recently) free'd
如果我删除delete [] myString ;
,它工作良好。
但是,为什么我得到错误,如果我删除它。
谢谢
因为您正在删除未分配的内存。你通过"new"分配6个字节,但随后你将var"mystr"重新分配给一个完全不同的指针(静态字符串"Hello"),而不是由"new"分配。因此,您尝试"删除"最初不是由您分配的静态字符串"Hello"。修复方法如下:
改变这些行:
char * mystr = new char[6];
mystr = "Hello";
:
char * mystr = new char[6];
strcpy(mystr, "Hello");
或者,您可以让"foo"只是"返回"hello";"而不删除main中的字符串。
myString
没有在堆上分配——foo
在堆上分配一个char数组,但是然后你扔掉指向它的指针并返回一个指向静态字符串的指针(它不在堆上)。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 在 C++ 中用派生类型重写成员函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 为重写std::exception的库生成swig接口时出错
- 如何强制从重写方法调用重写的方法基方法?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 如何将 if else 语句重写为 switch 语句
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 用 C 重写C++类
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 重写虚拟函数和继承
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++调用使用重写函数的父类函数
- 重写打印函数而不是覆盖基类
- 不允许在类定义之外重写
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- C++:从抽象类重写纯虚拟运算符重载
- 为什么我们需要重写terminate()