可以从任务管理器或Process Explorer中查看泄漏的GDI对象.(嗯,你没有看到泄漏,但你可以看到对象uasage数量是否持续上升.)
还有一些工具允许按类型查看GDI对象,例如GDIView [a],DeLeaker,DPUS或GDIDebug(sourecode).
[a]请注意,我认为GDIView是一个很好的工具,可以完成识别和确认存在的GDI泄漏的工作,但它并没有真正帮助您在大型应用程序中找到泄漏的代码.(我还会在这里注意到这个工具工作得非常好,看起来表现得很好,虽然它的主页很奇怪( - :)
还有一个名为leaktrap的WinDBG插件,它使用MSs Detours Library.
我也知道(并且已经使用过)AQTime的资源分析器,它允许检测应用程序中的GDI(和其他)资源泄漏,包括泄漏调用的堆栈跟踪.
现在,我的实际问题是:是否可以从VC++调试器中检测泄漏的GDI对象?因此,不需要单独的工具,并且在正常调试期间可以捕获GDI泄漏,而不必单独检查.
C++的容器vector,deque... at(index)除了operator[index]访问容器元素外,还提供访问器功能.
这个成员函数和成员运算符函数operator []之间的区别在于deque :: at信号,如果请求的位置超出范围,则抛出out_of_range异常.
我从来没有在代码中需要这个函数,因为在我的C++代码中访问可能超出范围的元素是没有意义的.始终编写代码以访问正确的索引(或者在索引无法匹配的情况下产生有意义的错误/异常.)
我会对真实世界的例子(可能来自一些开源项目,因为它会添加一些上下文)感兴趣,at()在生产代码中使用的地方.
也许有人可以举例说明使用at()有意义的算法问题.
注:我已经用它最近在一些单元测试代码,其中加入指数校验码不被认为值得的麻烦和抛出的异常out_of_range at()被认为是足够的信息+背景的情况下,测试中断.
注意:关于ildjarn的这个答案 - 我不想就此开始讨论或评论.我在"积极"的兴趣所在,那就是具体的例子它已被使用.谢谢.
史蒂夫告诉我,VC 2015和VC 2017实际上(将要)二进制兼容.
我找到了零信息.这在2017年的发行说明(RC)中 - 或几乎在任何地方,所以这里是:
Visual Studio 2017 (v141)Visual Studio 2015 (v140)(*):是啊,其实我去进取,安装了2017年的RC,从我能在表面上看到的,至少在相同 MSVCRT被使用,这是msvcp140.dll和vcruntime140.dll(尽管平台工具集被称为"V141".
visual-studio visual-c++ visual-c++-2015 visual-studio-2017 visual-c++-2017
我们收到了客户的本机(完整)故障转储文件.在Visual Studio(2005)调试器中打开它表明我们遇到了由试图分配~10MB块的realloc调用引起的崩溃.转储文件非常大(1.5 GB - 通常它们更像500 MB).
因此,我们得出结论,我们有一个内存"泄漏"或失控的分配,要么完全耗尽进程的内存,要么至少将其分散到足以使realloc失败.(请注意,这个realloc用于分配日志记录缓冲区的操作,我们并不感到惊讶它在这里失败,因为一次性使用10MB将是我们除了一些非常大的非常不可更改的缓冲区之外的更大分配之一 - 问题本身可能与此特定分配无关.)
编辑:在下面的Lex Li评论交换之后,我应该补充:这对我们来说是不可再现的(此刻).这只是一个客户转储显然显示失控的内存消耗.
现在我们有一个转储文件,但是我们如何找到导致内存使用过多的原因?
我们使用DebugDiag工具来分析转储文件(所谓的内存压力分析器),这是我们得到的:
Report for DumpFM...dmp
Virtual Memory Summary
----------------------
Size of largest free VM block 62,23 MBytes
Free memory fragmentation 81,30%
Free Memory 332,87 MBytes (16,25% of Total Memory)
Reserved Memory 0 Bytes (0,00% of Total Memory)
Committed Memory 1,67 GBytes (83,75% of Total Memory)
Total Memory 2,00 GBytes
Largest free block at 0x00000000`04bc4000
Loaded Module Summary
---------------------
Number …Run Code Online (Sandbox Code Playgroud) 我有一个名为@status的变量,我在这个select语句之前设置了它:
Select
ordr_num as num,
ordr_date as date,
ordr_ship_with as shipwith
From
order
where ordr_num = @ordrNum
Run Code Online (Sandbox Code Playgroud)
我只想选择ordr_ship_with列@status <> 'Cancelled',否则我想为shipwith选择null.我该如何做到这一点?
注意:我是一位经验丰富的C++程序员,所以我不需要任何指针基础知识.只是因为我从未与之合作void**并且很难将我的心智模型调整为void*与void**.我希望有人能够以一种好的方式解释这一点,这样我就能更容易地记住语义.
请考虑以下代码:(使用例如VC++ 2005编译)
int main() {
int obj = 42;
void* ptr_to_obj = &obj;
void* addr_of_ptr_to_obj = &ptr_to_obj;
void** ptr_to_ptr_to_obj = &ptr_to_obj;
void* another_addr = ptr_to_ptr_to_obj[0];
// another_addr+1; // not allowed : 'void*' unknown size
ptr_to_ptr_to_obj+1; // allowed
}
Run Code Online (Sandbox Code Playgroud) C++ 11实现会定义NULL为nullptr吗?
这是由新的C++标准规定的吗?
我有一个愚蠢的问题.我读了这篇关于std :: exception的文章http://www.cplusplus.com/doc/tutorial/exceptions/
在catch (exception& e),它说:
我们已经放置了一个通过引用捕获异常对象的处理程序(注意&符号和类型之后),因此这也捕获了从异常派生的类,就像myexception类的myex对象一样.
这是否意味着通过使用"&"您还可以捕获父类的异常?我认为&是在std :: exception中预定义的,因为最好将e(std :: exception)作为引用传递给对象.
在对另一个问题的评论中, Jonathan Wakely回应了我的陈述:
您永远不需要显式移动局部变量函数返回值.这是隐含的举动
- >
...永远不要说永远......如果局部变量与返回类型的类型不同,则需要显式移动,例如
std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; },但如果类型相同,则可能会移动...
所以有时我们可能不得不在返回时移动局部变量.
这个例子
std::unique_ptr<base> f() {
auto p = std::make_unique<derived>();
p->foo();
return p;
}
Run Code Online (Sandbox Code Playgroud)
很好,因为它给出了编译错误
> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一个很好的机会来检测这一般 - 这是这里的语言规则或unique_ptr ??
我们的项目中有一些严格类型的整数类型:
struct FooIdentifier {
int raw_id; // the only data member
// ... more shenanigans, but it stays a "trivial" type.
};
struct BarIdentifier {
int raw_id; // the only data member
// ... more shenanigans, but it stays a "trivial" type.
};
Run Code Online (Sandbox Code Playgroud)
基本上是这里提出的或类似于Unit Library 中使用的东西。
除了类型系统之外,这些结构基本上都是整数。
我的问题在这里现在是:有没有C ++语言保证这些类型奠定了相当于100%的内存作为一个经常int会是什么?
注意:由于我可以静态检查类型是否具有相同的大小(即没有填充),我真的只对无意外填充的情况感兴趣。我应该从一开始就添加这个注释
// Precodition. If platform would yield false here, I'm not interested in the result.
static_assert(sizeof(int) == sizeof(ID_t)); …Run Code Online (Sandbox Code Playgroud) c++ ×8
c++11 ×2
debugging ×2
visual-c++ ×2
c ×1
collections ×1
crash-dumps ×1
gdi ×1
heap ×1
null ×1
nullptr ×1
return ×1
sql ×1
sql-server ×1
t-sql ×1
windbg ×1