控件访问Visual Studio中的内存
Control accessing to memory in Visual Studio
我正在寻找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。
- 在Visual Studio中查找非法内存访问
- 在 Visual Studio 调试器中,如何从内存中打印字节范围?
- Visual Studio 的内存窗口仅包含问号
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- Visual Studio C++ 0xC0000005错误:对内存分配感到困惑
- 如何在Visual Studio中的内存中可视化实际HEXDEC
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- C++函数中的内存泄漏,Visual Studio 2012,链表
- 当Visual Studio停止调试程序时会自动清理内存
- Visual Studio在使用sockaddr_storage时会损坏内存
- 用于 Visual Studio 2010 C++的内存泄漏工具
- Visual Studio (VC++ 2005) 调试内存
- C++ Visual Studio - 在简单示例中解释内存泄漏检测
- Visual Studio 版本之间的不同未分配内存行为
- Oracle Solaris Studio 内存泄漏与 cout
- 在释放动态内存时,Visual Studio 中的堆损坏错误
- 如何在 Visual Studio 2012 Visual c++ 中动态分配内存
- 无法使用 CUDA + MATLAB + Visual Studio 检查全局内存
- Visual Studio 2008,检测内存泄漏,符号"__FILE__"未定义
- 使用Visual Studio将静态构建的库链接到共享库可能存在内存风险