小编Jer*_*ner的帖子

C++:除最后一个之外的模板参数的默认值?

我有我的模板化容器类,如下所示:

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++ templates arguments default

5
推荐指数
1
解决办法
6946
查看次数

如何确定反汇编代码在可执行文件中的位置?

我有一个包含错误的可执行文件(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 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?

感谢您提供的任何建议!

assembly executable patch otool

5
推荐指数
1
解决办法
1166
查看次数

IPv6组播地址:组ID字段是有效的112位还是32位?

我正在尝试理解选择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进行多播时设置这些位,我应该遇到什么问题?

multicast ipv6

5
推荐指数
1
解决办法
2972
查看次数

我怎样才能确保我所有的哈德森构建奴隶检查出每日构建的相同svn修订版?

我的工作场所使用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,我认为这可能会成功.

是否有一种常见/简单的方法来处理这个问题?

svn hudson build race-condition

5
推荐指数
1
解决办法
300
查看次数

是否有一个 kqueue()/kevent() 相当于 select() 的“errorfds”集?

今天我将一些代码从 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() 下是否真的不支持套接字错误条件,或者是否存在但以某种对我来说不明显的方式实现?

error-handling select kqueue

5
推荐指数
1
解决办法
273
查看次数

对于MacOS / X 10.8.x中不推荐使用的Carbon函数,该怎么办?

我有一个已经存在了一段时间(超过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文档,但是缺少搜索技能或者缺少他们的文档,因为我发现这些功能几乎没有,也没有替代品。

我有一些具体问题:

  1. 为什么不推荐使用这些功能?
  2. 我应该调用什么功能呢?
  3. 是否有一些我不知道的秘密文档存储库可以为我回答这些问题?

c macos-carbon deprecated osx-mountain-lion

5
推荐指数
1
解决办法
2292
查看次数

多处理Qt应用程序:如何将其限制为MacOS/X Dock中的单个图标?

我有一个Qt应用程序(出于超出此问题范围的原因)将每个窗口作为一个单独的进程启动.

这样可以正常工作,但在MacOS/X下,每个窗口/进程都显示为Dock中的单独条目.因此,当用户打开十几个窗口时,码头上有十几个相同的图标,这不是很有用(因为很难分辨哪个是哪个,图标开始变小).

有没有办法告诉Dock在单个Dock图标下将所有这些进程组合在一起?(特定于Mac的API会很好)

macos qt dock multiprocessing

5
推荐指数
1
解决办法
808
查看次数

故意破坏我的Windows应用程序的最佳方法是什么?

我已经在我的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()函数,但我不确定它应该是什么正确的参数.这是要走的路,还是有一些更具体的电话,我会更好用?

windows seh crash-reports

5
推荐指数
1
解决办法
294
查看次数

是否可以让Clang Static Analyzer理解引用计数?

情况:我的代码使用引用计数指针类(本质上类似,以提升::: 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_ptrintrusive_ptr等等-我不知道他们是如何处理这个问题)

独立的示例代码如下:

#include <stdio.h>

// This value will keep track of the …
Run Code Online (Sandbox Code Playgroud)

c++ reference-counting clang-static-analyzer

5
推荐指数
0
解决办法
237
查看次数

Python无法启动新线程多处理

我正在尝试使用一组计算机来运行数百万个小型模拟。为此,我尝试在主计算机上设置两台“服务器”,一台用于将队列中的输入变量添加到网络,另一台用于处理结果。

这是将内容放入模拟变量队列的代码:

"""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)

python multithreading network-programming multiprocessing

5
推荐指数
1
解决办法
6415
查看次数