为什么我们需要重写terminate()

why we need to override terminate()?

本文关键字:terminate 重写 我们 为什么      更新时间:2023-10-16

我的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数组,但是然后你扔掉指向它的指针并返回一个指向静态字符串的指针(它不在堆上)。