控件访问Visual Studio中的内存

Control accessing to memory in Visual Studio

本文关键字:内存 Studio 访问 Visual 控件      更新时间:2023-10-16

我正在寻找Visual Studio 2015的免费工具,它可以控制对内存的访问。我只找到了这篇文章(https://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx?f=255&MSPPError=-2147217396),它只控制内存泄漏-这很好,但还不够。当我创建数组并访问该数组时,我需要知道它

int* pointer = (int*)malloc(sizeof(int)*8);
for (int a = 0;a <= 8;a++)
    std::cout << *(pointer+a) << ' ';
free(pointer);
_CrtDumpMemoryLeaks();

这个例子不会抛出异常,但它仍然访问内存,内存超出了分配的空间。这是一个适用于Visual Studio 2015的工具,它会告诉我它吗?类似valgrind的东西
非常感谢。

您可以替换给定的Microsoft代码

int* pointer = (int*)malloc(sizeof(int)*8);
for (int a = 0;a <= 8;a++)
    std::cout << *(pointer+a) << ' ';
free(pointer);
_CrtDumpMemoryLeaks();

…这个:

{
    vector<int> v( 8 );
    for( i = 0; i <= 8; ++i )
    {
        cout << v.at( i ) << ' ';
    }
}
_CrtDumpMemoryLeaks();

由于检查该代码中的内存泄漏没有意义(事实上,尝试访问v[8]的异常确保了_CrtDumpMemoryLeaks()语句不会被执行),因此可以将其简化为

vector<int> v( 8 );
for( i = 0; i <= 8; ++i )
{
    cout << v.at( i ) << ' ';
}

现在,我已经很久没有检查索引错误等了,所以我不再确定用g++和Visual C++添加普通[]索引检查的确切魔法咒语。我只记得一个人可以,至少用g++。但无论如何,实际的方法不是费力地检查索引代码,而是避免手动索引,编写

// Fixed! No more problems! Hurray!
vector<int> v( 8 );
for( int const value : v )
{
    cout << value << ' ';
}

关于这个问题的更一般的方面,如何确保每一次无效的内存访问都会产生一个陷阱或类似的东西,这在实践中通常是不可能的,因为内存保护的粒度是内存的,在Windows的旧时代是4KB(由处理器的内存访问体系结构强加)。它可能仍然是4KB。如果每一个小的分配都被四舍五入到4K,然后有一个4K保护的页面,那么就会有太多的开销。

尽管如此,我还是认为这已经完成了。这是负担得起的:一个非常实用的单一案例。

然而,C++标准库没有这方面的功能,我也不认为Visual C++有任何扩展,但如果你真的想走这条路,那就去看看Windows API,比如VirtualAlloc和friends。