在多线程应用程序中调试崩溃时,我终于在此语句中找到了问题:
CSingleLock(&m_criticalSection, TRUE);
Run Code Online (Sandbox Code Playgroud)
请注意,它正在创建一个CSingleLock类的未命名对象,因此在此语句之后,临界区对象会立即解锁.这显然不是编码员想要的.此错误是由简单的输入错误引起的.我的问题是,有些我可以防止在编译时自己创建类的临时对象,即上面的代码类型应该生成编译器错误.一般来说,我认为每当一个类尝试进行某种资源获取时,就不应该允许该类的临时对象.有没有办法强制执行呢?
在尝试回答这个问题时,我发现代码int* p = new int[10]();编译好VC9编译器并将整数初始化为0.所以我的问题是:
new int;还是new int();?后者是否保证初始化变量?在C++ 11中,*_until仅当使用稳定时钟(即,仅以不变速率向前移动的时钟)时,超时功能才"按预期"运行.因为system_clock不是一个稳定的时钟,这意味着像这样的代码可以表现得非常惊人:
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
Run Code Online (Sandbox Code Playgroud)
除非在睡眠期间调整系统时钟,例如夏令时,否则这将导致当前线程休眠10秒.如果在休眠期间将时钟设置为一小时,则当前线程将休眠一小时10秒.
据我所知,*_untilC++ 11中的每个超时函数都有一个相应的*_for函数,它需要一个持续时间而不是一个时间点.例如,上面的代码可以重写如下:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
Run Code Online (Sandbox Code Playgroud)
这些*_for函数不应该担心在函数执行时调整的时钟,因为它们只是说等待多长时间,而不是等待时间应该是什么时间.
此问题不仅影响睡眠功能,对于future和try_lock函数的基于超时的等待也是如此.
我可以设想使用*_until具有不稳定时钟的功能的唯一情况是,当您想要考虑时钟调整时,例如,您想要睡到下周三凌晨3:30,即使有变化从现在到现在之间的夏令时间.还有其他情况下*_until功能比*_for功能更有意义吗?如果没有,是否安全地说,一般来说,*_for超时功能应优先于*_until功能?
我已经通过函数获得了控件的指针
CWnd* CWnd::GetDlgItem(int ITEM_ID)
Run Code Online (Sandbox Code Playgroud)
所以我有CWnd*指向控件的指针,但是在CWnd类中找不到任何能够检索给定控件的大小和位置的方法.有帮助吗?
虚拟函数如何在C#和Java中工作?
它是否使用与C++类似的相同vtable和vpointer概念,还是完全不同的东西?
我相信以前会被问到但是找不到它.是否有任何内置(即使用std :: wstring的方法或算法)方式对两个wstring对象进行不区分大小写的比较?
假设我有一个函数,其中参数通过值而不是const-reference传递.此外,假设在函数内部仅使用该值,即函数不会尝试修改它.在这种情况下,编译器是否能够确定它可以通过const-reference传递值(出于性能原因)并相应地生成代码?是否有任何编译器可以做到这一点?
我有一个像这样的头文件中定义的模板类.这里我也定义了一个静态变量:
#ifndef TEST1_H_
#define TEST1_H_
void f1();
static int count;
template <class T>
class MyClass
{
public:
void f()
{
++count;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
我已经在不同的cpp文件中定义了main()函数,如下所示:
int main(int argc, char* argv[])
{
MyClass<int> a;
a.f();
f1();
cout<<"Main:" << count << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在不同的cpp文件中实现了函数f1(),如下所示:
void f1()
{
MyClass<int> a;
a.f();
cout<<"F1: " <<count <<"\n";
}
Run Code Online (Sandbox Code Playgroud)
当我用VC6编译它时,输出为"F1:0 Main:2".这怎么可能?另外,一般情况下,如果我想将静态变量与模板一起使用,我应该如何处理?
在C++中,堆栈可能以哪种方式被破坏.我猜测的一种方法是通过访问超出其边界的数组来覆盖堆栈变量.有没有其他方式可以被破坏?
c++ ×9
mfc ×2
stl ×2
arrays ×1
c# ×1
c++11 ×1
constructor ×1
corruption ×1
java ×1
optimization ×1
stack ×1
static ×1
string ×1
templates ×1
temporary ×1
timeout ×1
unicode ×1
virtual ×1
visual-c++-6 ×1
vtable ×1