标签: dr-memory

C++ std :: vector <bool>使用drmemory给出了未初始化的读错误

我在我的项目中使用stl容器,我发现了一个我无法解释的奇怪错误.我们考虑以下代码:

#include <iostream>
#include <vector>

int main(int argc, char** argv)
{
    std::vector<bool> vec;
    vec.resize(5, false);
    std::cout << vec.at(0);
}
Run Code Online (Sandbox Code Playgroud)

这会按预期输出0,但如果我使用drmemory运行内存检查,则会发现未初始化的读取.任何人都可以帮助理解这种行为吗?

平台:win32; 编译器:mingw32 - gcc 4.7.2; Drmemory 1.6.0 - 构建2

c++ stl dr-memory

6
推荐指数
1
解决办法
442
查看次数

Windows 上的函数 async 泄漏内存

在我的一个应用程序中,当我开始使用 std::async 时,我引入了内存泄漏。在用内存博士这个工具检查问题后,我发现std::async经常会泄漏内存。

我做了一个快速测试来重现该问题:

#include <Windows.h>
#include <algorithm>
#include <future>

using namespace std;

void testMethod()
{
    for (int i = 0; i < 4; i++)
        Sleep(10);
}

int main()
{
    for (int i = 0; i < 100; i++)
    {
        auto result = async(launch::async, testMethod);
        result.wait();
    }

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码怎么可能在 Windows 上泄漏内存呢?Linux 上不会出现该问题。内存博士会产生如下日志:

Error #1: REACHABLE LEAK 40 direct bytes 0x007badb8-0x007bade0 + 0 indirect bytes
# 0 replace_operator_new_nomatch                                   [d:\drmemory_package\common\alloc_replace.c:2732]
# 1 MSVCR120D.dll!Concurrency::details::SubAllocator::Alloc        [f:\dd\vctools\crt\crtw32\concrt\suballocator.cpp:201]
# 2 MSVCR120D.dll!Concurrency::details::ExternalContextBase::Alloc [f:\dd\vctools\crt\crtw32\concrt\externalcontextbase.cpp:238]
# 3 …
Run Code Online (Sandbox Code Playgroud)

memory-leaks asynchronous c++11 dr-memory visual-studio-2013

5
推荐指数
0
解决办法
1390
查看次数

记忆博士和神秘的未初始化的阅读

下面的代码没有做任何有趣的事情,但神秘的是为什么Memory博士会认为有一个单一化的阅读?有任何想法吗?

#include <memory>

int main(int argc, const char* argv[])
{
    int aa[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::unique_ptr<int[]> p {new int[10]};

    for (auto i = 0; i < 10; ++i) {
        p[i] = aa[i];
    }

    return 0;
} // <-- Dr Memory says UNINITIALIZED READ here
Run Code Online (Sandbox Code Playgroud)

编辑:这是完整的错误详细信息.

Error #1: UNINITIALIZED READ: reading 0x0028ff20-0x0028ff24 4 byte(s)
# 0 __mingw_glob                              [src/main.cpp:14]
# 1 _setargv                                  [src/main.cpp:14]
# 2 __mingw_CRTStartup
# 3 mainCRTStartup
# 4 ntdll.dll!RtlInitializeExceptionChain    +0x62     (0x772c8fe2 …
Run Code Online (Sandbox Code Playgroud)

c++ dr-memory

5
推荐指数
1
解决办法
2000
查看次数

记忆博士相当于 valgrind 的“轨道起源”是什么?

在 valgrind 中,我打开--track-origins以找出未初始化的值来自哪里。

在 Windows 上,我使用 Dr. Memory,因为据我所知 valgrind 尚未移植。它报告未初始化的读取,但查看手册我似乎没有找到一个选项让它找出未初始化值的来源。但它告诉我哪个内存范围有问题。

  • 那么有没有人知道可以跟踪起源的选项(我忽略了)?
  • 如果没有这样的选项,那么有问题的内存范围是否有可能找出谁分配了它?

debugging dr-memory

5
推荐指数
0
解决办法
187
查看次数

我是在访问已经释放的内存,还是在这种情况下 DrMemory 报告错误?

我有以下程序:

#include <vector>

struct Comp1
{
    float x;
    std::vector<int> vec;
};

int main()
{
    std::vector<char> data;

    data.resize(sizeof(Comp1));

    Comp1* ptr1 = new (&data[0]) Comp1({.3f,{3,4,2,1}});

    data.resize(sizeof(Comp1)*2);

    Comp1* ptr2 = new (&data[sizeof(Comp1)]) Comp1({.2f,{2,3,4}});

    ptr1->~Comp1();

    std::vector<char>::iterator itrStart = data.begin();
    std::vector<char>::iterator itrEnd = itrStart + sizeof(Comp1);
    data.erase(itrStart,itrEnd);

    ptr2 = reinterpret_cast<Comp1*>(&data[0]);

    ptr2->~Comp1();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译没有问题。在我的机器上执行没有问题。通过 GDB 运行它,没有任何报告。我的理解是,我在上面所做的一切都是正确的(除了可能我错过了从 a到 astd::launder时的使用?)。reinterpret_castchar*Comp1*

但是,在此程序上调用 DrMemory:

drmemory.exe test.exe -callstack_max_frames 40 -malloc_max_frames 40 -free_max_frames 40
Run Code Online (Sandbox Code Playgroud)

给我以下错误输出:

Dr. Memory version 2.2.0 build 1 built on Jul  1 …
Run Code Online (Sandbox Code Playgroud)

c++ dr-memory

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