相关疑难解决方法(0)

内存管理,堆腐败和C++

所以,我需要一些帮助.我正在用C++开发一个项目.但是,我想我已经设法破坏了我的堆.这是基于我std::string向一个类添加了一个并从另一个类中赋值的事实std::string:

std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;
Run Code Online (Sandbox Code Playgroud)

使用堆栈转储在我的系统上崩溃.所以基本上我需要停下来查看我的所有代码和内存管理内容,找出我搞砸了的地方.代码库仍然很小(约1000行),因此这很容易实现.

不过,我对这种东西感到头疼,所以我想我会把它扔出去.我在一个Linux系统上并且已经四处乱窜valgrind,虽然我不知道我在做什么,但它确实报告说它std::string的析构函数是无效的.我不得不承认从谷歌搜索中获得"堆腐败"一词; 关于这类东西的任何通用文章也将受到赞赏.

(之前rm -rf ProjectDir,在C#再做一次:D)

编辑:我还没有说清楚,但我要求的是诊断这些记忆问题的建议.我知道std :: string的内容是正确的,所以这是我做过的事情(或者是一个bug,但是选择不是问题).我确信我可以查看我编写的代码,你很聪明的人会立即看到问题,但我想将这种代码分析添加到我的'工具箱'中,就像它一样.

c++ memory heap stack

18
推荐指数
3
解决办法
1万
查看次数

立即检测Windows上的堆损坏错误.怎么样?

我睡不着!:)

我在Windows上有一个相当大的项目,遇到了一些堆损坏问题.我已阅读所有SO,包括这个好主题:如何调试堆损坏错误?但是没有什么比开箱即用更能帮助我了.Debug CRTBoundsChecker检测到堆损坏,但地址总是不同的,并且检测点总是远离实际存储器重写.我没有睡到半夜,并制作了以下黑客:

DWORD PageSize = 0;

inline void SetPageSize()
{
    if ( !PageSize )
    {
        SYSTEM_INFO sysInfo;
        GetSystemInfo(&sysInfo);
        PageSize = sysInfo.dwPageSize;
    }
}

void* operator new (size_t nSize)
{
    SetPageSize();
    size_t Extra = nSize % PageSize;
    nSize = nSize + ( PageSize - Extra );
    return Ptr = VirtualAlloc( 0, nSize, MEM_COMMIT, PAGE_READWRITE);
}

void operator delete (void* pPtr)
{
    MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery(pPtr, &mbi, sizeof(mbi));
    // leave pages in reserved state, but free …
Run Code Online (Sandbox Code Playgroud)

c c++ heap-memory virtualalloc heap-corruption

14
推荐指数
2
解决办法
6893
查看次数

如何调试意外终止的win32进程?

我有一个用C++编写的Windows应用程序偶尔会蒸发.我使用蒸发这个词,因为没有任何遗留下来:没有来自Windows的"我们很抱歉"的消息,没有来自Dr. Watson工厂的崩溃转储......

有一次,在调试器下发生了崩溃,调试器没有中断 - 它显示应用程序仍在运行.当我手动暂停执行时,我发现我的进程不再有任何线程.

如何捕获此过程终止的原因?

c++ crash debugging winapi

7
推荐指数
1
解决办法
5334
查看次数

将对象传递给重载运算符

昨天有人给了我一个错误的节目.在MVS 2010中工作,我发现了问题,也是它的替代方案.问题是重载的插入操作符类.其原型如下......

void matrix :: operator << (matrix&) ;
Run Code Online (Sandbox Code Playgroud)

它是从这样的地方打来的......

matrix m ;
m.operator << (m) ;
Run Code Online (Sandbox Code Playgroud)

我发现编译器不允许发送与调用函数的引用参数相同的对象.但我不明白背后的原因以及它造成了什么问题.如果有人能够解释,我将不胜感激.谢谢.

编辑: 实际发生的是,在调试时,它进入函数内部,在执行时出现main,进入外部依赖文件dbgdel.cpp并在此行停止.

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Run Code Online (Sandbox Code Playgroud)

c++ oop runtime-error operator-overloading insertion

7
推荐指数
1
解决办法
269
查看次数

在C++中查找构造函数的调用者

寻找一种快速而又脏的方法来识别构造函数的调用者(或任何函数)我正在编写宏来帮助通过转储this指针来识别内存泄漏OutputDebugString.

知道调用ctor和dtor的位置有助于识别问题.

tnx\0

c++ windows memory-leaks

3
推荐指数
2
解决办法
1056
查看次数