小编Mar*_* Ba的帖子

是否可以从Visual Studio调试器中检测GDI泄漏?

可以从任务管理器或Process Explorer中查看泄漏的GDI对象.(嗯,你没有看到泄漏,但你可以看到对象uasage数量是否持续上升.)

还有一些工具允许按类型查看GDI对象,例如GDIView [a],DeLeaker,DPUSGDIDebug(sourecode).

[a]请注意,我认为GDIView是一个很好的工具,可以完成识别和确认存在的GDI泄漏的工作,但它并没有真正帮助您在大型应用程序中找到泄漏的代码.(我还会在这里注意到这个工具工作得非常好,看起来表现得很好,虽然它的主页很奇怪( - :)

还有一个名为leaktrap的WinDBG插件,它使用MSs Detours Library.

我也知道(并且已经使用过)AQTime的资源分析器,它允许检测应用程序中的GDI(和其他)资源泄漏,包括泄漏调用的堆栈跟踪.

现在,我的实际问题是:是否可以从VC++调试器中检测泄漏的GDI对象?因此,不需要单独的工具,并且在正常调试期间可以捕获GDI泄漏,而不必单独检查.

c++ debugging gdi visual-studio visual-c++

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

C++ std库中`at()`索引函数的真实用例?

C++的容器vector,deque... at(index)除了operator[index]访问容器元素外,还提供访问器功能.

这个成员函数和成员运算符函数operator []之间的区别在于deque :: at信号,如果请求的位置超出范围,则抛出out_of_range异常.

我从来没有在代码中需要这个函数,因为在我的C++代码中访问可能超出范围的元素是没有意义的.始终编​​写代码以访问正确的索引(或者在索引无法匹配的情况下产生有意义的错误/异常.)

我会对真实世界的例子(可能来自一些开源项目,因为它会添加一些上下文)感兴趣,at()在生产代码中使用的地方.

也许有人可以举例说明使用at()有意义的算法问题.

注:我已经用它最近在一些单元测试代码,其中加入指数校验码不被认为值得的麻烦和抛出的异常out_of_range at()被认为是足够的信息+背景的情况下,测试中断.

注意:关于ildjarn的这个答案 - 我不想就此开始讨论或评论.我在"积极"的兴趣所在,那就是具体的例子被使用.谢谢.

c++ collections standard-library

22
推荐指数
4
解决办法
576
查看次数

Visual-C++ - 2017二进制兼容VC++ - 2015?

史蒂夫告诉我,VC 2015和VC 2017实际上(将要)二进制兼容.

我找到了信息.这在2017年的发行说明(RC)中 - 或几乎在任何地方,所以这里是:

  • 是一个用VC++构建的C++(C++接口)DLL - 2017与VC++ - 2015构建的DLL二进制兼容吗?
  • 2017和2015使用相同(动态)运行时库吗?
  • 如果是这样,Platform Toolset 和?之间的运行时区别是什么?(*)Visual Studio 2017 (v141)Visual Studio 2015 (v140)

(*):是啊,其实我去进取,安装了2017年的RC,从我能在表面上看到的,至少在相同 MSVCRT被使用,这是msvcp140.dllvcruntime140.dll(尽管平台工具集被称为"V141".

visual-studio visual-c++ visual-c++-2015 visual-studio-2017 visual-c++-2017

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

Windows崩溃转储文件的详细内存使用情况分析?

我们收到了客户的本机(完整)故障转储文件.在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)

c++ debugging heap windbg crash-dumps

21
推荐指数
1
解决办法
2万
查看次数

如何根据条件选择列?

我有一个名为@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.我该如何做到这一点?

sql t-sql sql-server

19
推荐指数
2
解决办法
7万
查看次数

void*和void**的心理模型?

注意:我是一位经验丰富的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 c++ void-pointers

19
推荐指数
2
解决办法
879
查看次数

在C++ 11中是否将NULL定义为nullptr?

C++ 11实现会定义NULLnullptr吗?

这是由新的C++标准规定的吗?

c++ null nullptr c++11

19
推荐指数
2
解决办法
1万
查看次数

通过引用捕获std :: exception?

我有一个愚蠢的问题.我读了这篇关于std :: exception的文章http://www.cplusplus.com/doc/tutorial/exceptions/

catch (exception& e),它说:

我们已经放置了一个通过引用捕获异常对象的处理程序(注意&符号和类型之后),因此这也捕获了从异常派生的类,就像myexception类的myex对象一样.

这是否意味着通过使用"&"您还可以捕获父类的异常?我认为&是在std :: exception中预定义的,因为最好将e(std :: exception)作为引用传递给对象.

c++

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

什么时候返回语句需要显式移动?

对另一个问题评论中, 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 ??

c++ return implicit-conversion move-semantics c++11

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

C++ 是否保证具有单个平凡成员的“平凡”结构具有相同的二进制布局?

我们的项目中有一些严格类型的整数类型:

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++ memory-layout language-lawyer

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