【问题标题】:Valgrind leak detection with segfault带段错误的 Valgrind 泄漏检测
【发布时间】:2012-04-04 12:14:53
【问题描述】:

我正在检查我的代码是否存在内存泄漏。在我得到代码之前一切都很好:

mSystem = new LightSystem();
sf::View *view = th::DisplayManager::Get()->GetCamera();
mSystem->SetView(*view);

SetView 的工作非常小(提取传递的view 指针的一些成员。当最新的代码行被注释时,一切正常,但取消注释一切都在默认模式下工作,并且在使用 valgrind 进行内存泄漏检测时失败(@987654324 @)。

==23703== Use of uninitialised value of size 8
==23703==    at 0x6B8472: ltbl::LightSystem::SetView(sf::View const&) (LightSystem.cpp:55)
==23703==    by 0x6A7A7D: th::LightManager::Initialize() (LightManager.cpp:46)
==23703==    by 0x6A75EA: th::Root::Initialize() (Root.cpp:101)
==23703==    by 0x6A7113: th::Root::Root() (Root.cpp:66)
==23703==    by 0x6A7553: th::Root::Get() (Root.cpp:88)
==23703==    by 0x6291A8: th::Game::Initialize() (Game.cpp:36)
==23703==    by 0x61DC1C: main (main.cpp:82)
==23703== 
==23703== Invalid read of size 8
==23703==    at 0x6B8472: ltbl::LightSystem::SetView(sf::View const&) (LightSystem.cpp:55)
==23703==    by 0x6A7A7D: th::LightManager::Initialize() (LightManager.cpp:46)
==23703==    by 0x6A75EA: th::Root::Initialize() (Root.cpp:101)
==23703==    by 0x6A7113: th::Root::Root() (Root.cpp:66)
==23703==    by 0x6A7553: th::Root::Get() (Root.cpp:88)
==23703==    by 0x6291A8: th::Game::Initialize() (Game.cpp:36)
==23703==    by 0x61DC1C: main (main.cpp:82)
==23703==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==23703== 
==23703== 
==23703== Process terminating with default action of signal 11 (SIGSEGV)
==23703==  Access not within mapped region at address 0x8
==23703==    at 0x6B8472: ltbl::LightSystem::SetView(sf::View const&) (LightSystem.cpp:55)
==23703==    by 0x6A7A7D: th::LightManager::Initialize() (LightManager.cpp:46)
==23703==    by 0x6A75EA: th::Root::Initialize() (Root.cpp:101)
==23703==    by 0x6A7113: th::Root::Root() (Root.cpp:66)
==23703==    by 0x6A7553: th::Root::Get() (Root.cpp:88)
==23703==    by 0x6291A8: th::Game::Initialize() (Game.cpp:36)
==23703==    by 0x61DC1C: main (main.cpp:82)
==23703==  If you believe this happened as a result of a stack
==23703==  overflow in your program's main thread (unlikely but
==23703==  possible), you can try to increase the size of the
==23703==  main thread stack using the --main-stacksize= flag.
==23703==  The main thread stack size used in this run was 8388608.

问题是:为什么在没有 valgrind 的情况下它可以成功运行并打破它。 我也尝试将--main-stacksize= 设置为一个很大的值,但它对我没有帮助。

【问题讨论】:

  • 如果没有 valgrind,它可能无法“工作”。它的行为未定义,因为您使用的是无效指针,这意味着任何事情都可能发生。
  • 不要忘记问题不一定与mSystem->SetView(*view); 行有关。在此之前,您可能已经损坏了内存中的任何地方。 Valgrind 可能只是在改变现状……

标签: c++ segmentation-fault valgrind


【解决方案1】:
==23703== Process terminating with default action of signal 11 (SIGSEGV)
==23703==  Access not within mapped region at address 0x8

在某些时候(可能是LightSystem.cpp:55),您正在取消引用您分配给8 的指针,它看起来不像一个有效地址。

【讨论】:

  • 太奇怪了,我检查了所有指针(之前和之后的view),一切似乎都很好
猜你喜欢
  • 1970-01-01
  • 2015-02-28
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多