标记为可能丢失块的静态指针是否损坏?
Is a static pointer marked as possibly lost block bad?
在阅读了关于 "possibly lost" 使用 Valgrind 阻止消息后,它们似乎很糟糕。
我收到静态指针 class 成员的错误。
我想验证我们的代码没有问题。
我从 Valgrind 得到这个:
==27986== 76 bytes in 1 blocks are possibly lost in loss record 370 of 1,143
==27986== at 0x4C247F0: operator new(unsigned long) (vg_replace_malloc.c:319)
==27986== by 0x107CFEE8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:94)
==27986== by 0xDDCE21F: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (basic_string.tcc:140)
==27986== by 0x107D19B2: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (basic_string.h:1722)
==27986== by 0xD381F19: MyNamespace::MyClass::MyMethod() (MyClass.cpp:189)
==27986== by 0xD1A6E17: __static_initialization_and_destruction_0(int, int) (IProperty.cpp:520)
==27986== by 0xD1B2B97: _GLOBAL__sub_I_IProperty.cpp (IProperty.cpp:551)
==27986== by 0x400D4F2: call_init (in /lib64/ld-2.5.so)
==27986== by 0x400D5B4: _dl_init (in /lib64/ld-2.5.so)
==27986== by 0x4000AA9: ??? (in /lib64/ld-2.5.so)
My class(简体),此错误指的是:
我在这里将代码简化为 post,但如果需要,我可以添加更多细节。
MyClass.h
class MyClass
{
private:
double _p1, _p2, _p3, _p4;
std::string _p5, _p6, _p7;
public:
MyClass(double p1, double p2, double p3, double p4, std::string p5, std::string p6, std::string p7)
{
_p1 = p1;
_p2 = p2;
_p3 = p3;
_p4 = p4;
this->_p5 = p5;
this->_p6 = p6;
this->_p7 = p7;
}
static MyClass& MyMethod();
}
MyClass.cpp
static MyClass* _myPtr = NULL;
MyClass& MyClass::MyMethod()
{
if (!_myPtr )
{
_myPtr = new MyClass(1, 2.1, 3, 4, "xxxx", "yyyyy", "zzzzz");
}
return *_myPtr ;
}
我认为我们正确地使用了静态指针。但是,文档说这通常是内存泄漏,除非您对指针做了一些有趣的事情。我不认为我们在做任何有趣的事情。
这个错误实际上是指构造函数作为参数接收的字符串 class 的内部指针吗?
我们是否应该担心这个可能丢失块的错误?
这是一次内存泄漏,并不重要,因为这个对象应该与程序本身一样长,但永远不会调用 MyClass 的析构函数并释放指针。如果 MyClass 使用一些外部资源来编程,那可能是个问题。
尝试
MyClass& MyClass::MyMethod()
{
static MyClass instance(1, 2.1, 3, 4, "xxxx", "yyyyy", "zzzzz");
return instance;
}
将调用析构函数(当所有静态对象都将被销毁时 - 在退出 main 之后)。
在 C++11 中,它甚至被授予线程安全性。
根据定义,您的程序存在内存泄漏,但属于良性泄漏,因为未释放的堆内存量是有限的。除此之外,确保在程序退出时调用所有析构函数是一种很好的做法。例如。考虑一下,有时您希望通过记录到文件流来扩展 MyClass
。如果你不销毁流对象,文件句柄在每个没有资源泄漏的主要操作系统上仍将关闭,但进程内缓冲的任何数据都将被丢弃。此外,很容易避免这种泄漏。即使您想延迟创建对象,也可以使用 std::unique_ptr
或 boost::optional
,例如,以确保它在退出时被正确销毁。
也就是说,如果您确定要保持代码原样,您可以创建一个 suppression for Valgrind,并且该块将不再列在使用相应抑制文件的后续运行中。
在阅读了关于 "possibly lost" 使用 Valgrind 阻止消息后,它们似乎很糟糕。
我收到静态指针 class 成员的错误。 我想验证我们的代码没有问题。
我从 Valgrind 得到这个:
==27986== 76 bytes in 1 blocks are possibly lost in loss record 370 of 1,143
==27986== at 0x4C247F0: operator new(unsigned long) (vg_replace_malloc.c:319)
==27986== by 0x107CFEE8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:94)
==27986== by 0xDDCE21F: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (basic_string.tcc:140)
==27986== by 0x107D19B2: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (basic_string.h:1722)
==27986== by 0xD381F19: MyNamespace::MyClass::MyMethod() (MyClass.cpp:189)
==27986== by 0xD1A6E17: __static_initialization_and_destruction_0(int, int) (IProperty.cpp:520)
==27986== by 0xD1B2B97: _GLOBAL__sub_I_IProperty.cpp (IProperty.cpp:551)
==27986== by 0x400D4F2: call_init (in /lib64/ld-2.5.so)
==27986== by 0x400D5B4: _dl_init (in /lib64/ld-2.5.so)
==27986== by 0x4000AA9: ??? (in /lib64/ld-2.5.so)
My class(简体),此错误指的是: 我在这里将代码简化为 post,但如果需要,我可以添加更多细节。
MyClass.h
class MyClass
{
private:
double _p1, _p2, _p3, _p4;
std::string _p5, _p6, _p7;
public:
MyClass(double p1, double p2, double p3, double p4, std::string p5, std::string p6, std::string p7)
{
_p1 = p1;
_p2 = p2;
_p3 = p3;
_p4 = p4;
this->_p5 = p5;
this->_p6 = p6;
this->_p7 = p7;
}
static MyClass& MyMethod();
}
MyClass.cpp
static MyClass* _myPtr = NULL;
MyClass& MyClass::MyMethod()
{
if (!_myPtr )
{
_myPtr = new MyClass(1, 2.1, 3, 4, "xxxx", "yyyyy", "zzzzz");
}
return *_myPtr ;
}
我认为我们正确地使用了静态指针。但是,文档说这通常是内存泄漏,除非您对指针做了一些有趣的事情。我不认为我们在做任何有趣的事情。
这个错误实际上是指构造函数作为参数接收的字符串 class 的内部指针吗?
我们是否应该担心这个可能丢失块的错误?
这是一次内存泄漏,并不重要,因为这个对象应该与程序本身一样长,但永远不会调用 MyClass 的析构函数并释放指针。如果 MyClass 使用一些外部资源来编程,那可能是个问题。
尝试
MyClass& MyClass::MyMethod()
{
static MyClass instance(1, 2.1, 3, 4, "xxxx", "yyyyy", "zzzzz");
return instance;
}
将调用析构函数(当所有静态对象都将被销毁时 - 在退出 main 之后)。
在 C++11 中,它甚至被授予线程安全性。
根据定义,您的程序存在内存泄漏,但属于良性泄漏,因为未释放的堆内存量是有限的。除此之外,确保在程序退出时调用所有析构函数是一种很好的做法。例如。考虑一下,有时您希望通过记录到文件流来扩展 MyClass
。如果你不销毁流对象,文件句柄在每个没有资源泄漏的主要操作系统上仍将关闭,但进程内缓冲的任何数据都将被丢弃。此外,很容易避免这种泄漏。即使您想延迟创建对象,也可以使用 std::unique_ptr
或 boost::optional
,例如,以确保它在退出时被正确销毁。
也就是说,如果您确定要保持代码原样,您可以创建一个 suppression for Valgrind,并且该块将不再列在使用相应抑制文件的后续运行中。