我使用 C API,它接受一个指向数组的指针。该数组可以为空。
当使用 :
声明指针时,API 可以按预期工作T *ptr = new T[size];
但我想使用
C++
容器的底层指针(使用 .data()
),以避免负责释放。
所以,我像这样声明我的容器:
std::vector<T> vec(size);
不幸的是,当
size
是0
时,ptr
不是nullptr
并且vec.data()
是nullptr
,
因此,API 的行为与以前不同。
有没有办法从空容器中获取非 nullptr ?
在您的情况下,避免负责释放。
std::unique_ptr
可能比std::vector
更适合:
std::unique_ptr<T[]> ptr(size);
但是
size
无法使用该智能指针保存/检索...
没有标准的,但你可以尝试像下面这样的东西来代替 vec.data() - 即使很糟糕,你应该看看 C 接口是否可以改变:
vec.empty() ? reinterpret_cast<T*>(0xdeadbeef) : vec.data()
这是一个非空 ptr,无法取消引用 - 因此如果 C 代码实际上尝试取消引用它,它将会崩溃。