Sep*_*ehr 3 c++ memory-leaks memory-management shared-ptr c++11
我已经实现了一个简单的结构:
struct ListenerNode
{
ListenerNode() : previous(nullptr), next(nullptr), listener(nullptr), once(false) {}
std::shared_ptr<ListenerNode> previous;
std::shared_ptr<ListenerNode> next;
std::function<void(int)> listener;
bool once;
};
Run Code Online (Sandbox Code Playgroud)
这将代表场景图实现中的一个实体.我观察到的奇怪行为是当我使用结构时,就像:
int main(int argc, char** argv)
{
ListenerNode n;
}
Run Code Online (Sandbox Code Playgroud)
它泄漏了内存,但当我使用它时:
int main(int argc, char** argv)
{
ListenerNode* n = new ListenerNode();
delete n;
}
Run Code Online (Sandbox Code Playgroud)
它没有泄漏记忆!我不明白这里发生了什么.我一直认为,new当变量超出范围时,不要立即调用析构函数来创建类/结构的实例.
有人可以向我解释这里发生了什么吗?我也没有看到任何明显的参考增量.
根据您的评论,您测试内存泄漏,如下面的代码片段所示:
int main(int argc, char** argv)
{
ListenerNode n;
_CrtDumpMemoryLeaks();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在_CrtDumpMemoryLeaks()被调用的时候,n还没有超出范围.你一定可以访问的内容n后,_CrtDumpMemoryLeaks()没有任何问题.n在main()遇到闭合支撑后被破坏.
如果你添加一对额外的大括号:
int main(int argc, char** argv)
{
{ ListenerNode n; }
_CrtDumpMemoryLeaks();
}
Run Code Online (Sandbox Code Playgroud)
然后,n在遇到额外的闭合支撑时被破坏.在您致电时_CrtDumpMemoryLeaks(),n根本无法访问,因为它已经超出范围.
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |