我不知道在这里想些什么......
我们有一个作为服务运行的组件.它在我的本地机器上运行得非常好,但是在其他一些机器上(两台机器RAM都等于2GB),它会在第二天和连续几天开始生成bad_alloc异常.问题是该过程的内存使用量保持不变,大约为50Mb级别.另一个奇怪的事情是,通过跟踪消息,我们已经定义了从stringstream对象抛出的异常,该对象只会向流中插入不超过1-2 Kb的数据.如果重要的话,我们正在使用STL-Port.
现在,当你得到一个bad_alloc异常时,你认为这是一个内存泄漏.但是我们所有的手动分配都包含在一个智能指针中.此外,当整个过程仅使用~50Mb(内存使用量每天保持不变(并且肯定不会上升))时,我无法理解stringstream对象如何缺少内存.
我无法为您提供代码,因为项目非常大,抛出异常的部分除了创建字符串流和<<某些数据然后记录它之外别无其他功能.
所以,我的问题是......当进程只使用2GB的50Mb内存时,如何发生内存泄漏/ bad_alloc?还有什么其他的猜测可能是错的?
在此先感谢,我知道这个问题很模糊,我只是有点绝望,我尽力解释这个问题.
我可以比较三个变量,如下所示,而不是做if((x==y)&&(y==z)&&(z=x))?[如果所有三个变量具有相同的值,则应执行if语句.这些是布尔.]
if(debounceATnow == debounceATlast == debounceATlastlast)
{
debounceANew = debounceATnow;
}
else
{
debounceANew = debounceAOld;
}
Run Code Online (Sandbox Code Playgroud) 我正在为自己的乐趣和训练设计一款小游戏.游戏的真实身份与我的实际问题完全无关,假设它是Mastermind游戏(它实际上是:)
我的真正目标是拥有一个IPlayer可用于任何玩家的界面:计算机或人,控制台或gui,本地或网络.我也打算有一个GameController,它只处理两个IPlayers.
IPlayer接口看起来像这样:
class IPlayer
{
public:
//dtor
virtual ~IPlayer()
{
}
//call this function before the game starts. In subclasses,
//the overriders can, for example, generate and store the combination.
virtual void PrepareForNewGame() = 0;
//make the current guess
virtual Combination MakeAGuess() = 0;
//return false if lie is detected.
virtual bool ProcessResult(Combination const &, Result const &) = 0;
//Answer to opponent's guess
virtual Result AnswerToOpponentsGuess(Combination const&) = 0;
};
Run Code Online (Sandbox Code Playgroud)
GameController类会做这样的事情:
IPlayer* …Run Code Online (Sandbox Code Playgroud) 在我的C++实现(Visual Studio 2008实现)中,我看到以下行 <cassert>
#ifdef NDEBUG
#define assert(_Expression) ((void)0)
Run Code Online (Sandbox Code Playgroud)
我不明白需要将0转换为void.在我看来,这
#ifdef NDEBUG
#define assert(_Expression) (0)
Run Code Online (Sandbox Code Playgroud)
甚至简单地说
#ifdef NDEBUG
#define assert(_Expression) 0
Run Code Online (Sandbox Code Playgroud)
考虑到assert(expr)可以使用的背景,会做什么.
那么,什么是类型的0危险INT而不是类型0 无效在这种情况下?任何现实的例子?
我正在玩一些图形,我用箭头键实现了简单的相机移动.我的第一种方法是覆盖keyPressEvent做这样的事情:
switch(key)
{
case up: MoveCameraForward(step); break;
case left: MoveCameraLeft(step); break;
...
}
Run Code Online (Sandbox Code Playgroud)
这不符合我的意愿.当我按住(例如)前进键时,相机向前移动"步进"单位,然后暂停一段时间然后继续移动.我猜这是事件的生成方式,以避免在有点长按键的情况下发生多个事件.
所以,我需要在Paint()日常工作中轮询键盘.我还没有找到如何用Qt做到这一点.我想到了一个map<Key, bool>将更新的内容keyPressEvent并在其中keyReleaseEvent轮询该地图Paint().有更好的想法吗?感谢您的任何见解.
对于像C++这样的语言,标准的存在是必须的.好的编译器会尽力(最好是大多数好的编译器)来遵守.许多编译器都有语言扩展,其中一些是标准允许的,其中一些不是.后两种例子:
gcc的类型
microsoft的编译器允许纯虚函数声明同时具有纯指定符(= 0)和定义(标准禁止 - 我们不讨论为什么,这是另一个主题:)
(还有很多其他的例子)
这两个示例在以下意义上都很有用:example1是一个非常有用的功能,它将在c ++ 0x中以不同的名称提供.example2也很有用,微软决定不尊重没有意义的禁令.
我很感激编译器提供语言扩展,帮助开发人员完成日常工作.但是这里有一个问题:不应该有一个选项,在设置时,要求编译器尽可能符合标准,无论它们是否与标准一致.例如,visual studio有这样一个选项,称为禁用语言扩展.但是,嘿,他们仍然允许示例2.
我希望每个人都能正确理解我的问题.MSVC允许example2是一件很棒的事情,我非常希望该功能符合标准.它不会破坏任何兼容代码,它没有什么坏处.它只是不标准.
当禁用语言扩展名设置为true时,您希望微软禁用example2吗?请注意,单词microsoft,example2等是占位符:)为什么?
再次,只是为了确保.关键点在于:编译器是否需要提供兼容版本(可选地在设置中设置)(在其限制中,例如我不是在谈论导出),因为它们提供了一个非标准的更好的替代方案,并且是也许甚至是标准的超集,因而没有破坏任何东西.
是否可以ostream使用字符输出十六进制数字A-F而不是a-f?
int x = 0xABC;
std::cout << std::hex << x << std::endl;
Run Code Online (Sandbox Code Playgroud)
这是输出,abc而我更愿意看到ABC.
我正在用Qt Creator编写一个简单的OpenGL程序,它基本上创建了一个QGLWidget,显示它并运行应用程序循环.我通常喜欢通过使用实际调试器和监视等的预处理器符号打开和关闭诊断消息来调试更多.在Qt Creator中,我们有一个名为Application Output的选项卡,但我看到的只是"Starting xxx.exe.xxx.exe退出代码0".没有任何输出std::cout或std::cerr.现在我知道我可以从cmd.exe启动我的应用程序(是的,我正在使用Windows,喜欢它:P)并在那里看到输出,但我希望我可以直接从IDE看到输出.那可能吗?谢谢
这个问题的灵感来自另一个问题.在尝试回答这个问题时,我明白自己有很多问题.所以......考虑以下几点:
struct S1
{
enum { value = 42 };
};
template <class T> struct S2
{
typedef S1 Type;
};
template <class T> struct S3
{
typedef S2<T> Type;
};
template <class T> struct S4
{
typedef typename T::Type::Type Type; //(1)//legal?
enum {value = T::Type::Type::value }; //(2)//legal?
};
int main()
{
S4<S3<S2<S2<S1> > > >::value;
}
Run Code Online (Sandbox Code Playgroud)
这与MSVC9.0和Online Comeau成功编译.但是,困扰我的是我不理解typename(1)中提到的内容以及为什么我们不需要typename(2).
我已经尝试过这两种语法(合成器?),我认为它应该是MSVC上的两种失败:
typedef typename T::typename Type::Type Type;
enum {value = typename T::typename Type::Type::value };
Run Code Online (Sandbox Code Playgroud)
和 …
在std::basic_string类模板有成员函数find_first_of和find_first_not_of.
该<algorithm>头,但只包含一个通用find_first_of.
问题1:是否缺席
std::find_first_not_of(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2)
Run Code Online (Sandbox Code Playgroud)
只是疏忽(例如copy_if)或是故意省略,因为行为可以通过另一个标准功能实现?
当然我可以写自己的find_first_not_of,但是
问题2:某处有一个现成的解决方法<algorithm>吗?例如,缺席由于存在而copy_if得到补偿remove_copy_if
提前致谢