如果我以下列方式使用placement new,我的代码似乎可靠地运行。如果我使用注释代码,我经常会遇到分段错误(11)或意外结果。返回静态分配的对象的地址也有效。
我已经验证过没有返回null,而且我的测试脚本中的单个Python对象只调用了一次这个函数。
extern "C"
{
void * hail_detector_new()
{
alignas(alignof(hail::Detector)) static U8 allocation[sizeof(hail::Detector)];
// return new(std::nothrow) hail::Detector;
return new(allocation) hail::Detector;
}
}
Python参数和返回类型声明:
f = _library.hail_detector_new
f.restype = c_void_p
f.argtypes = None
class Detector(object):
def __init__(self):
self._object = _library.hail_detector_new()
版本
Squall: clang --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Squall: python --version
Python 2.7.13 :: Continuum Analytics, Inc.