假设我有一个看起来像这样的结构(一个POD):
struct Foo
{
int i;
double d;
};
Run Code Online (Sandbox Code Playgroud)
以下两行之间有什么区别:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
Run Code Online (Sandbox Code Playgroud) 我一直在为Windows上的本机C++程序评估分析器和内存检查工具,所有这些工具都希望以管理员权限安装和运行.我很少在我的机器上以管理员身份登录.如果我需要安装某些东西或做一些需要管理权限的东西,我会使用runas并且它运行良好.
分析器是否合法需要管理员权限,或者探查器开发人员是否只是懒惰?在此基础上拒绝所有这些工具,我是不合理的吗?
我在XP Pro机器上使用VS 2005进行开发.
我们的Windows应用程序经常挂在内存中,我正在尝试使用windbg来追踪问题.我对windbg很新,可以使用一些建议(我已经开始阅读高级Windows调试了).
该应用程序是用VB编写的C++和COM对象的混合体.有时当你退出时,应用程序似乎会消失但是任务管理器会在内存中显示它,显然是空闲的.
!线程告诉我这个:
ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 2
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
PreEmptive GC Alloc Lock
ID OSID ThreadOBJ State GC Context Domain Count APT Exception
0 1 175c 001aa040 4220 Enabled 09131b78:09131fe8 001a2b80 0 STA
6 2 143c 001b4b48 b220 Enabled 00000000:00000000 001a2b80 0 MTA (Finalizer)
Run Code Online (Sandbox Code Playgroud)
对于我未经训练的眼睛,看起来它被一个单线程公寓阻挡的终结队列保持活着.这看起来合情合理吗?
~0kb产量:
ntdll!KiFastSystemCallRet
user32!NtUserGetMessage+0xc
mfc80!AfxInternalPumpMessage+0x18 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 153]
mfc80!CWinThread::Run+0x54 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 625]
mfc80!AfxWinMain+0x69 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 47]
WARNING: Stack unwind information not available. Following frames may be wrong.
OurApp+0x7e8274
kernel32!BaseProcessStart+0x23 …Run Code Online (Sandbox Code Playgroud) 更新:此问题已在 VS2022 v17.2 Preview 1 中修复
CString当我将 MFC 项目设置为使用 C++20 时,在将字符串文字与实例进行比较时遇到错误。
例如:
CString s1 = _T("s1");
// this works
if (s1 == _T("s1")) {
cout << "Match!"
}
// this generates a compiler error
if (_T("s1") == s1) {
cout << "Match!";
}
Run Code Online (Sandbox Code Playgroud)
根据CStringT文档,有很多==重载:
friend bool operator==(const CStringT& str1, const CStringT& str2) throw();
friend bool operator==(const CStringT& str1, PCXSTR psz2) throw();
friend bool operator==(const CStringT& str1, PCYSTR psz2) throw();
friend bool operator==(const CStringT& str1, XCHAR …Run Code Online (Sandbox Code Playgroud) 我们为产品使用的库之一使用单例来访问它.我很确定它是作为静态实例实现的(它不是开源的).这适用于单个文档应用程序,但我们的应用程序可能加载了多个文档.我假设访问该实例是这样写的:
Instance* getInstance() {
static Instance* inst = new Instance();
return inst;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有没有办法可以强大地创建多个实例?我唯一能想到的就是不仅要处理并使用某种类型的IPC来将它们联系在一起.我想不出任何不那么黑的东西.
我已经要求供应商实现某种类型的会话令牌,因此我可以拥有多个并发实例,但它们很大而且我们很小.
科里
编辑:
而不是尝试一些狡猾的恶作剧来获得我想要的东西,我将用我自己的类包装整个事物并为每个getter添加一个会话密钥.在内部,我将跟踪已分配的内容添加我自己的发布方法以返回资源.由于很多原因,这是次优的,但我想不出更好的主意.
感谢大家的好评.
这似乎有效,但我不是100%肯定它是合法的,并会欣赏一些反馈.
我有一个派生自通用基类的子类.它类似于奇怪的重复模板模式,但不同.
在derived.h中:
template <class T>
class Derived : public T
{
public:
Derived();
... and some other stuff ...
};
Run Code Online (Sandbox Code Playgroud)
在derived.cpp中:
#include "derived.h"
template <class T>
Derived<T>::Derived()
{
...
}
// defining the variations I need here avoids linker errors
// see http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13
template Derived<Base1>::Derived();
template Derived<Base2>::Derived();
Run Code Online (Sandbox Code Playgroud)
在其他一些文件中:
#include "derived.h"
void test()
{
Derived<Base1> d1;
Derived<Base2> d2;
... do stuff with d1 and d2 ...
}
Run Code Online (Sandbox Code Playgroud) 我有一个Windows C++程序正在执行以下操作:
FILE* pf = ...; *stdout = *pf; // stdout is defined in stdio.h
我正在寻找一个解释,当你更改stdout文件句柄的值时会发生什么.这只是重定向标准输出的一种方式吗?
-cr
在C++中,有没有理由不通过类实例访问静态成员变量?我知道Java对此皱眉,并想知道它是否在C++中很重要.例:
class Foo {
static const int ZERO = 0;
static const int ONE = 1;
...
};
void bar(const Foo& inst) {
// is this ok?
int val1 = inst.ZERO;
// or should I prefer:
int val2 = Foo::ZERO
...
};
Run Code Online (Sandbox Code Playgroud)
我有第二个问题.如果我声明一个静态double,我必须在某处定义它,并且该定义必须重复该类型.为什么必须重复这种类型?例如:
In a header:
class Foo {
static const double d;
};
In a source file:
const double Foo::d = 42;
Run Code Online (Sandbox Code Playgroud)
为什么我必须在cpp文件中重复"const double"部分?
c++ ×8
static ×2
c ×1
c++20 ×1
com ×1
const ×1
constructor ×1
default ×1
exit ×1
filehandle ×1
global ×1
hung ×1
inheritance ×1
mfc ×1
privileges ×1
profiling ×1
singleton ×1
stdout ×1
templates ×1
windbg ×1