为什么这种新用法会导致分段错误?

时间:2017-10-04 15:27:54

标签: python c++ python-2.7 ctypes

如果我以下列方式使用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.

0 个答案:

没有答案