我有我的模板化容器类,如下所示:
template<
class KeyType,
class ValueType,
class KeyCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<KeyType>,
class ValueCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<ValueType>
>
class MyClass
{
[...]
}
Run Code Online (Sandbox Code Playgroud)
这意味着当我实例化这个类的对象时,我可以通过几种不同的方式来实现:
MyClass<MyKeyType, MyValueType> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor, MyCustomValueCompareFunctor> myObject;
Run Code Online (Sandbox Code Playgroud)
这些都很好.当我想要实例化使用ValueCompareFunctor参数的非默认版本的MyClass时,问题出现了,但我仍然想使用KeyCompareFunctor参数的默认值.然后我要写这个:
MyClass<MyKeyType, MyValueType, AnObnoxiouslyLongSequenceOfCharacters<MyKeyType>, MyCustomValueCompareFunctor> myObject;
Run Code Online (Sandbox Code Playgroud)
如果我能以某种方式省略第三个参数并且只写下这个会更方便:
MyClass<KeyType, ValueType, MyCustomValueCompareFunctor> myObject;
Run Code Online (Sandbox Code Playgroud)
由于MyCustomValueCompareFunctor仅适用于MyValueType类型的对象而不适用于MyKeyType类型的对象,因此编译器似乎至少在理论上可以解决我的意思.
有没有办法在C++中执行此操作?
我有一个包含错误的可执行文件(C++,i386,在 MacOS/X Tiger 下编译,如果重要的话)。该错误的修复很简单——代码中有一个地方调用 fork() 而它不应该。因为修复很简单,而且因为此时从头开始重新编译可执行文件会很困难(不要问),我想直接修补可执行文件/二进制文件。
作为迈出的第一步,我在我的可执行文件上运行了“otool -tV MyExecutableName”,瞧,我在反汇编输出中发现了这个:
./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d subl $0x10,%esp
0002ce10 calll 0x0051adac
0002ce15 movzbl 0x14(%ebp),%esi
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
[... many more lines omitted ...]
Run Code Online (Sandbox Code Playgroud)
所以我想做的是替换第 0002ce19 行的操作码,这样它就不会调用 _fork,而是无条件地跳转到失败情况(即它应该像 fork() 返回 -1 一样)
不幸的是,我在反汇编/二进制补丁方面是一个完全的新手,所以我不确定如何去做。特别是,我的问题是:
1)我应该将哪些字节写入位置 0002ce19 到 0002xe1d 以获得我想要的?我假设它是“jmp 0x0002cf02”的组装等价物,但我如何弄清楚这些字节是什么?
2) "otool -tV" 打印的偏移量似乎是到可执行文件的 __TEXT 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?
感谢您提供的任何建议!
我正在尝试理解选择IPv6多播地址组ID的规则,并且RFC似乎有些不一致.例如,在RFC 2373第2.7节中显示了此图:
| 8 | 4 | 4 | 112 bits |
+------ -+----+----+---------------------------------------------+
|11111111|flgs|scop| group ID |
+--------+----+----+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
......但是在第2.7.2节中它显示了这个:
| 8 | 4 | 4 | 80 bits | 32 bits |
+------ -+----+----+---------------------------+-----------------+
|11111111|flgs|scop| reserved must be zero | group ID |
+--------+----+----+---------------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,Group ID字段的高80位是否可用?如果它们可用,是否仅在某些情况下(例如,当使用非以太网网络技术时?)如果我在通过以太网LAN进行多播时设置这些位,我应该遇到什么问题?
我的工作场所使用Hudson进行日常构建,有几个构建从属服务器(一个Linux,一个Windows,一个Mac)从svn检查我们的完整代码库,并在每天午夜构建我们的应用程序.一切都运作良好.
偶尔会出现一些问题......有时开发人员会工作到很晚,并会在午夜之后检查svn的更改.发生这种情况时,某些每日构建从服务器可能会在处理svn提交之前执行'svn checkout',而其他构建从服务器将在处理提交后执行此操作.当发生这种情况时,我们最终会在不同平台上构建不同的版本...例如,Mac版本可能是SVN版本5555的版本,而Windows版本最终是SVN版本5556的版本.这很糟糕,因为我们想要所有特定日期的每日构建基于相同的代码库.
我想避免这种情况的一种方法是禁止开发人员在晚上11:30到12:30之间提交svn,但我更喜欢一种更优雅的解决方案,它不依赖于开发人员的行为.有吗?特别是,如果有办法告诉hudson检查当前午夜当前代码的修订版本(例如"svn co -r {"the-current-date"}")而不是签出HEAD,我认为这可能会成功.
是否有一种常见/简单的方法来处理这个问题?
今天我将一些代码从 select() 移植到 kqueue(),我注意到 kevent() 似乎没有 select() 的“异常设置”功能的模拟。
也就是说,select()的函数签名是:
int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);
Run Code Online (Sandbox Code Playgroud)
...对于 kevent(),EVFILT_READ 对应于 (readfds),EVFILT_WRITE 对应于 (writefds),但我没有看到任何像 EVFILT_ERROR 对应于 (errorfds) 的内容。
kevent() 下是否真的不支持套接字错误条件,或者是否存在但以某种对我来说不明显的方式实现?
我有一个已经存在了一段时间(超过10年)的C ++代码库,并且可以正常运行,但是我注意到当我在OS / X 10.8.x(Mountain Lion)下对其进行编译时,编译器会发出关于以下内容的弃用警告:它调用的一些Carbon函数:
../system/SetupSystem.cpp:575:44: warning: 'UpTime' is deprecated: first
deprecated in OS X 10.8 [-Wdeprecated-declarations]
../system/SetupSystem.cpp:575:22: warning: 'AbsoluteToNanoseconds' is
deprecated: first deprecated in OS X 10.8 [-Wdeprecated-declarations]
../system/SystemInfo.cpp:249:25: warning: 'MPProcessors' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]
Run Code Online (Sandbox Code Playgroud)
我想将此代码库升级到Apple认可的新工作方式(从而避免警告和将来(如果Apple最终删除这些功能时)的麻烦),但是我不知道新标准是什么。我浏览了developer.apple.com上的OS / X文档,但是缺少搜索技能或者缺少他们的文档,因为我发现这些功能几乎没有,也没有替代品。
我有一些具体问题:
我有一个Qt应用程序(出于超出此问题范围的原因)将每个窗口作为一个单独的进程启动.
这样可以正常工作,但在MacOS/X下,每个窗口/进程都显示为Dock中的单独条目.因此,当用户打开十几个窗口时,码头上有十几个相同的图标,这不是很有用(因为很难分辨哪个是哪个,图标开始变小).
有没有办法告诉Dock在单个Dock图标下将所有这些进程组合在一起?(特定于Mac的API会很好)
我已经在我的Qt应用程序的Windows版本中添加了一个迷你核心转储功能(通过__try/__ except和MiniDumpWriteDump()),这样如果/当我的应用程序崩溃时,.dmp文件将被写入磁盘让我以后查看和调试.
这非常有效,但是对于测试,我希望有一个已知可靠的方法来使我的程序崩溃.例如,GUI中可能存在"立即崩溃"按钮,当用户单击它时,它将导致应用程序故意崩溃.
当然,一种方法是这样的:
int * badPointer = NULL;
*badPointer = 666;
Run Code Online (Sandbox Code Playgroud)
这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为 - 特别是,C++标准不要求上面的代码导致崩溃,所以它是可能的(从语言 - 律师的角度来看) )当上面的代码执行时,编译器的某些未来版本不会崩溃.
作为一种更"官方"的方法,我试过这个:
abort();
Run Code Online (Sandbox Code Playgroud)
...它会终止程序,但它不会导致Windows结构化异常触发MiniCrashDump处理程序,因此不会写入.dmp文件.
我的问题是,是否有一个"官方正确的方式"来破坏我的计划?我看到Windows API有一个我可以调用的RaiseException()函数,但我不确定它应该是什么正确的参数.这是要走的路,还是有一些更具体的电话,我会更好用?
情况:我的代码使用引用计数指针类(本质上类似,以提升::: intrusive_ptr)来管理其动态分配并避免内存泄漏。
AFAICT可以正常工作,并且不会泄漏内存;但是,当我在使用此类的代码上运行Clang静态分析器时,Clang似乎无法理解引用计数逻辑,因此会生成有关内存泄漏和释放后使用错误的警告。
下面的玩具代码(为清楚起见已大大简化了)演示了该问题-它可以编译并运行而不会泄漏内存(如运行时将打印到的分配的对象计数所指示的stdout那样),但是如果我scan-build在其上运行,我得到以下输出:
$ scan-build g++ testrefcount.cpp -o testrefcount
scan-build: Using '/Users/jaf/checker-279/bin/clang' for static analysis
testrefcount.cpp:43:54: warning: Use of memory after it is freed
const MyRefCountedObject * GetObject() const {return _obj;}
^~~~~~~~~~~
testrefcount.cpp:52:8: warning: Potential memory leak
}
^
2 warnings generated.
scan-build: 2 bugs found.
scan-build: Run 'scan-view /var/folders/q9/9w3p5x650wgfpbcws3zhsc6h0000gn/T/scan-build-2019-01-12-122209-5219-1' to examine bug reports.
Run Code Online (Sandbox Code Playgroud)
我的问题是,有什么办法可以修改我的代码,以使Clang的静态分析器不会在这里发出假阳性?我想我可以在中包装引用计数方法#ifndef __clang_analyzer__,但这似乎是一个丑陋的解决方案(类似于将磁带放在“检查引擎”灯上),这将阻止CSA检测到此代码的任何实际问题,因此我想如果有更好的方法,宁愿避免这种情况。(是的,我知道shared_ptr和intrusive_ptr等等-我不知道他们是如何处理这个问题)
独立的示例代码如下:
#include <stdio.h>
// This value will keep track of the …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用一组计算机来运行数百万个小型模拟。为此,我尝试在主计算机上设置两台“服务器”,一台用于将队列中的输入变量添加到网络,另一台用于处理结果。
这是将内容放入模拟变量队列的代码:
"""This script reads start parameters and calls on run_sim to run the
simulations"""
import time
from multiprocessing import Process, freeze_support, Manager, Value, Queue, current_process
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
class MultiComputers(Process):
def __init__(self, sim_name, queue):
self.sim_name = sim_name
self.queue = queue
super(MultiComputers, self).__init__()
def get_sim_obj(self, offset, db):
"""returns a list of lists from a database query"""
def handle_queue(self):
self.sim_nr = 0
sims = self.get_sim_obj()
self.total = len(sims)
while len(sims) > 0:
if self.queue.qsize() > 100:
self.queue.put(sims[0]) …Run Code Online (Sandbox Code Playgroud)