Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当退出失败时清理字符串,而不是退出(0)_C++_Memory_Memory Management_Memory Leaks_Valgrind - Fatal编程技术网

C++ 当退出失败时清理字符串,而不是退出(0)

C++ 当退出失败时清理字符串,而不是退出(0),c++,memory,memory-management,memory-leaks,valgrind,C++,Memory,Memory Management,Memory Leaks,Valgrind,因此,当exit(0)发生时,字符串被神奇地清理干净,valgrind报告没有泄漏 > 退出(ExtIObTebug) >,它可以在多个点, Valgnnd >报告“我可能创建的一组C++字符串”。 当我知道退出失败发生时,我如何清理它们 编辑:我指的是我创建的字符串,如下所示: 第22行string include=“#include” 瓦尔格林: ==42430== ==42430== HEAP SUMMARY: ==42430== in use at exit: 100,201

因此,当
exit(0)
发生时,字符串被神奇地清理干净,
valgrind
报告没有泄漏

<> > <代码>退出(ExtIObTebug)<代码> >,它可以在多个点,<代码> Valgnnd<代码> >报告“我可能创建的一组C++字符串”。 当我知道退出失败发生时,我如何清理它们

编辑:我指的是我创建的字符串,如下所示:

第22行
string include=“#include”

瓦尔格林:

==42430== 
==42430== HEAP SUMMARY:
==42430==     in use at exit: 100,201 bytes in 22 blocks
==42430==   total heap usage: 33 allocs, 11 frees, 101,121 bytes allocated
==42430== 33 bytes in 1 blocks are possibly lost in loss record 6 of 22
==42430==    at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==42430==    by 0x4EF2568: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==42430==    by 0x4EF2676: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==42430==    by 0x4EF42D5: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==42430==    by 0x401C5A: processOneFile(std::istream&, std::ostream&, Node*, std::string) (include.cc:22)
==42430==    by 0x402497: processOneFile(std::istream&, std::ostream&, Node*, std::string) (include.cc:99)
==42430==    by 0x402C82: main (include.cc:172)
==42430==
==42430==堆摘要:
==42430==在出口处使用:22个块中的100201字节
==42430==总堆使用率:33个alloc,11个free,分配101121字节
==42430==1个块中的33个字节可能在22个块中的丢失记录6中丢失
==42430==at 0x4C2B1C7:新运算符(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==42430==by 0x4EF2568:std::string::_Rep::_S_create(无符号长、无符号长、std::分配器常量&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==42430==0x4EF2676:???(在/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21中)
==42430==by 0x4EF42D5:std::basic_string::basic_string(char const*,std::allocator const&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==42430==by 0x401C5A:processOneFile(std::istream&,std::ostream&,Node*,std::string)(include.cc:22)
==42430==by 0x402497:processOneFile(std::istream&,std::ostream&,Node*,std::string)(include.cc:99)
==42430==by 0x402C82:main(include.cc:172)

这听起来不像是内存泄漏。一旦进程退出,操作系统将回收与其关联的堆内存。释放内存时,通常要做的是调整应用程序本地的堆分配记帐信息。

这是一条失控的评论

总而言之,记忆在这里不是什么大问题。由于退出
,程序将终止,因此泄漏最多持续几毫秒。哎呀


使用exit时,您真正需要注意的是那些可能做了重要事情而未运行的析构函数,例如将数据刷新到屏幕或文件,礼貌地挂断网络连接,以及释放操作系统未管理的资源。除非该程序必须像领班的斧头一样巧妙地立即终止,
返回
main
并正常退出

如果这不是一个选项,或者因为这是C++,任何调用<代码>退出>代码>都应该是非常例外的,<代码>抛出一个异常并得到所有堆栈在你的一边展开的善。< /P> @用户:我必须查看您的代码才能提出好的建议。你可以用一些简单的东西来测试,比如

抛出“噢,废话!”,但通常我会扩展如下内容:

#include <iostream>
#include <exception>
#include <string>
class Failure: public std::exception
{
private:
    std::string mErrMsg;

public:
    Failure(std::string errMsg):mErrMsg(errMsg)
    {
        // does nothing
    }
    const char* what() const noexcept
    {
        return mErrMsg.c_str();
    }
};
然后我将我的
main
或其他一些低级函数包装在try/catch块中以记录错误。这里有
main

int main()
{
    try
    {
        function();
        return EXIT_SUCCESS;
    }
    catch (Failure &excp)
    {
        std::cerr << excp.what();
        return EXIT_FAILURE;
    }
}
在斯特德尔


我不会为退出(0)
抛出
,我也不建议您这样做。我也不建议退出(0)。一个好的程序结果应该是非常常见的,在非特殊情况下,并通过常规的代码流进行处理

等等,如果程序正在退出,这有关系吗?操作系统将释放分配给程序的内存。还有一个很好的例子。使用
exit
时,您真正需要注意的是那些可能做了重要事情但没有运行的析构函数。除非程序必须用一个头斧的斧头终止,否则代码>返回< /代码>你的方式退出并正常退出。或者由于这是C++,任何调用“代码>退出<代码>的东西都应该是非常特殊的,抛出异常并得到所有堆栈展开的好处。我想退出0确实运行了所有这些东西。而退出失败则不然。你能更具体地说明一下例外情况吗?哪里我在试什么?我在扔什么?我应该用它来替换所有导致它退出_失败的if语句吗?@Ben如果你想用valgrind来查找实际的泄漏并且输出混乱,这很重要。虽然问题特别提到字符串,但是那些引用了外部资源并且确实需要适当清理的对象呢(即运行其析构函数)?操作系统还应清理文件句柄等内容。如果您已刷新了对磁盘的所有写入操作等,则您可能是安全的,但确保数据确实安全地写入磁盘是一个远比这复杂的主题:)只要在完成对文件句柄和网络套接字的写入后关闭/刷新它们,就不会有问题。阿菲克。Git是一个很好的例子,它故意不关闭资源或释放内存,因为它没有持续运行的计划。这正是我要说的。如果每次写入后都不刷新,则会有缓冲的内容。由于析构函数从未被调用,缓冲区从未被刷新,因此任何文件中的数据都不完整。@Barmar Fair:)
int main()
{
    try
    {
        function();
        return EXIT_SUCCESS;
    }
    catch (Failure &excp)
    {
        std::cerr << excp.what();
        return EXIT_FAILURE;
    }
}
description of the bad stuff that happened