首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们需要重写terminate()?

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

Stack Overflow用户
提问于 2011-10-21 06:22:51
回答 2查看 823关注 0票数 0

我的C++程序有一个错误:

代码语言:javascript
复制
#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 ;,它会工作得很好。

我应该释放堆上分配的内存,对吗?

但是,为什么我得到了错误,如果我删除它。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-10-21 06:24:43

因为您正在删除未分配的内存。您通过"new“分配了6个字节,但是您将var "mystr”重新分配给了一个完全不同的指针(静态字符串"Hello"),该指针不是由"new“分配的。因此,您尝试“删除”不是您首先分配的静态字符串"Hello“。修复方法如下:

更改以下行:

代码语言:javascript
复制
 char * mystr = new char[6]; 
 mystr = "Hello"; 

要这样做:

代码语言:javascript
复制
char * mystr = new char[6]; 
strcpy(mystr, "Hello");

或者,您可以让"foo“只返回”“;”,而不删除main中的字符串。

票数 8
EN

Stack Overflow用户

发布于 2011-10-21 06:25:18

myString不是在堆上分配的-- foo在堆上分配了一个字符数组,但是您随后丢弃了指向它的指针,并返回一个指向静态字符串(不在堆上)的指针。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7842968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档