【发布时间】:2014-04-19 21:42:14
【问题描述】:
首先:我知道如果一个对象的析构函数抛出了应用程序的行为就不能指望......问题是关于内存问题。
所以,现在这很清楚了:
查看应用程序:
#include <stdlib.h>
#include <iostream>
class T
{
public:
T() : ma(0)
{std::cout << "T::T ->default<-" << std::endl; }
T(const char* a) : ma(a)
{std::cout << "T::T ->" << ma << "<-" << std::endl; }
~T()
{std::cout << "T::~T ->" << ma << "<-" << std::endl; }
private:
const char* ma;
};
int main()
{
T* t = new T();
delete t;
}
看看它的 valgrind 输出:
$ valgrind ./a.out
==29554== Memcheck, a memory error detector
==29554== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==29554== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==29554== Command: ./a.out
==29554==
T::T ->default<-
T::~T ->==29554==
==29554== HEAP SUMMARY:
==29554== in use at exit: 0 bytes in 0 blocks
==29554== total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==29554==
==29554== All heap blocks were freed -- no leaks are possible
==29554==
==29554== For counts of detected and suppressed errors, rerun with: -v
==29554== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
解释:T::~T ->==29554== 告诉我析构函数遇到了危险情况(std::cout 接受了一个未定义的空值)所以应用程序的行为是无法控制的......
由于它没有打印出 "<-" 并且它立即给我 valgrind 提示,我希望它在那个特定点退出。 Valgrind 没有报告任何段错误或类似的东西......
而且,valgrind 报告没有内存泄漏......这让我很困惑......所以我认为发生的情况是:
- 我打电话给
delete t; - 应用程序释放内存
t -
t的析构函数被调用。
你能解释一下这里发生了什么吗?
编辑:有一个更清楚的问题:
是在释放的内存上调用析构函数还是在 std::cout 获得空对象时析构函数中没有未定义的行为?
【问题讨论】:
-
请在你的测试用例中有一个异常(贴出来的代码没用)
-
@DieterLücking 没用是什么意思?
-
您应该使用
static_cast<const void *>(ma)b/c cout 将其视为 c 样式字符串。
标签: c++ memory valgrind destructor undefined-behavior