我刚写了一个C++代码,它做了一些字符串操作,但是当我运行ValgRing时,它显示了一些可能的内存泄漏.将代码调试成颗粒状级别I编写了一个简单的C++程序,看起来像:

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
        std::string myname("Is there any leaks");
        exit(0);
}

在这上面我看到:

==20943== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 26 from 1)
==20943== malloc/free: in use at exit: 360,645 bytes in 12,854 blocks.
==20943== malloc/free: 65,451 allocs, 52,597 frees, 2,186,968 bytes allocated.
==20943== For counts of detected errors, rerun with: -v
==20943== searching for pointers to 12,854 not-freed blocks.
==20943== checked 424,628 bytes.
==20943== 
==20943== LEAK SUMMARY:
==20943==    definitely lost: 0 bytes in 0 blocks.
==20943==      possibly lost: 917 bytes in 6 blocks.
==20943==    still reachable: 359,728 bytes in 12,848 blocks.
==20943==         suppressed: 0 bytes in 0 blocks.
==20943== Reachable blocks (those to which a pointer was found) are not shown.
==20943== To see them, rerun with: --show-reachable=yes

然后我突然意识到我们已经强制退出了(我也是在我的原始C++代码中执行的).现在的问题是,我想退出程序,因为我之前的旧代码正在等待新代码的退出状态.例如,二进制a.out等待b.out的退出状态.有没有办法避免内存泄漏,或者我真的应该担心内存泄漏,因为程序在那个时候已经退出了.

这也给我提出了另一个问题,这样的规范有害吗?

#include<stdio.h>
#include<cstdlib>
int main()
{
        char *p=(char *)malloc(sizeof(char)*1000);
        exit(0);
}

推荐答案

如果你坚持使用exit():

#include<iostream>
int main(){
    {
        std::string myname("Are there any leaks?");
    }
    exit(0);
}

此外,当您从main返回时,返回值将成为应用程序的退出代码.因此,如果您想要传递退出代码,请在main()中使用return exitCode;,而不是exit.

关于这一部分:

这也给我提出了另一个问题,这样的规范有害吗?

是的,因为这是一种BAD度编程的习惯.

操作系统将清除所有未能释放的内存,因此只要您没有吃掉所有系统内存和页面文件,就不应该损坏操作系统.

然而,编写草率/泄漏的代码可能会变成习惯,因此依赖操作系统来清理混乱是个坏主意.

C++相关问答推荐

在struct中调用函数,但struct在void中 *

*p[num]和(*p)num的区别

GCC预处理宏和#杂注GCC展开

无法用C++编译我的单元测试

使用GOTO从多个嵌套循环C继续

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

Can函数指针指向C++中具有不同参数连续性的函数

为什么GDB/MI进程的FIFO循环中有read()阻塞

如何在ASM中访问C struct 成员

FRIDA-服务器成为端口扫描的目标?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

Boyer Moore算法的简单版本中的未定义行为

有没有一种方法可以用C创建保留限定符的函数?

错误:字符串在C中获得意外输出

静态初始化顺序失败是否适用于C语言?

如何使用空元素块声明指针数组

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

如何正确探测平台设备?

为什么这里的符号没有解析?