我的程序中有一个相当严重的错误 - 偶尔调用new()会抛出bad_alloc.
从我在bad_alloc上找到的文档中,似乎抛出了以下原因:
当计算机内存不足时(肯定没有发生,我有4GB的RAM,程序在使用少于5MB(在taskmanager中检查)时抛出bad_alloc,后台没有严重的运行).
如果内存变得过于分散而不能分配新的块(这也不太可能 - 我分配的最大块大小约为1KB,并且在崩溃发生之前不会超过100次).
基于这些描述,我真的没有任何可以抛出bad_alloc的地方.
但是,我运行的应用程序运行多个线程,这可能会导致问题.通过测试单个线程上的所有对象,一切似乎都顺利进行.我能想到的另一件事就是在这里发生的某种竞争条件可能是因为同时在多个地方调用new()而引起的,但我尝试添加互斥锁来防止这种行为发生没有效果.
因为该程序是几百行,我不知道问题究竟在哪里,我不知道发布的代码片段是什么(如果有的话).相反,我想知道是否有任何工具可以帮助我测试这种事情,或者是否有任何一般策略可以帮助我解决这个问题.
我正在使用Microsoft Visual Studio 2008,Poco用于线程化.
我一直在实现我自己的红黑树版本,主要基于维基百科的算法(http://en.wikipedia.org/wiki/Red-black_tree).它在很大程度上相当简洁,但有一部分我想澄清.
从具有2个非叶子(非NULL)子节点的树中删除节点时,它表示将任一方的子节点移动到可删除节点中,并删除该子节点.
基于此,我对哪一方要删除感到困惑.我是否随机选择一侧,我是否在两侧之间交替,或者我是否会在未来的每次删除时都坚持到同一侧?
我想在 bash 脚本中将字符串写入文件,但不知道如何防止变量扩展。一个示例脚本:
#!/bin/bash
cat >./foo.bar <<EOL
t=$(ping 8.8.8.8)
EOL
Run Code Online (Sandbox Code Playgroud)
产生输出:
t=
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=17ms TTL=57
Reply from 8.8.8.8: bytes=32 time=16ms TTL=57
Reply from 8.8.8.8: bytes=32 time=17ms TTL=57
Reply from 8.8.8.8: bytes=32 time=17ms TTL=57
Ping statistics for 8.8.8.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 16ms, Maximum = 17ms, Average = 16ms
Run Code Online (Sandbox Code Playgroud)
所以它似乎$(ping 8.8.8.8)正在被执行并且输出正在被写入文件。如何编写提供的文字字符串而不扩展任何内容?
我有一个虚构的课:
template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}
Run Code Online (Sandbox Code Playgroud)
在程序执行的某个时刻,我想设置m_data一个大块的已分配内存并在T那里构造一个对象.
目前,我一直在使用这段代码:
void construct()
{
*m_data = T();
}
Run Code Online (Sandbox Code Playgroud)
我现在意识到这可能不是最好的想法......如果T有一个私人任务操作员,在某些情况下不会工作.
是否有正常/更好的方式来做我在这里尝试的事情?
我可以在C中使用以下原型删除最后一个节点 - int delete(struct node*head,int item)
注意:这里的第一个参数是指向启动节点而不指向指向启动节点的指针.
谢谢
作为一个学习练习,我刚刚尝试实现自己的"合并排序"算法.我在std :: list上做了这个,它显然已经内置了函数sort()和merge().但是,我打算将它移到我自己制作的链表中,所以实现不是特别重要的.
问题在于std :: list不具备访问随机节点的功能,只能访问前/后和单步执行.我最初计划通过这个列表以某种方式执行简单的二进制搜索,并通过几个步骤找到我的答案.
事实上,std :: list中已经内置了用于执行这些排序的函数,这让我相信有一种同样简单的方式以我想要的方式访问列表.
无论如何,感谢您的帮助!