C++ Swift-C++;通过C API的字符串

C++ Swift-C++;通过C API的字符串,c++,swift,C++,Swift,我有Swift与C API的桥接 我想这样做: const char * CApiFunc(){ std::string str = "some_str"; return str.c_str() } const char * CApiFunc2(){ std::string str = "some_str"; char * tmp = new char[str.length() + 1]; memcpy(tmp, str.c_str(), str.le

我有Swift与C API的桥接

我想这样做:

const char * CApiFunc(){
    std::string str = "some_str";

    return str.c_str()
}
const char * CApiFunc2(){
    std::string str = "some_str";
    char * tmp = new char[str.length() + 1];
    memcpy(tmp, str.c_str(), str.length());
    tmp[str.length()] = 0;
    return tmp;
}
但这会导致问题,因为
str
从堆栈中删除,并且返回的地址不正确。除了将
std::string
复制到新分配的数组并返回指向该数组的指针之外,还有其他方法吗,如下所示:

const char * CApiFunc(){
    std::string str = "some_str";

    return str.c_str()
}
const char * CApiFunc2(){
    std::string str = "some_str";
    char * tmp = new char[str.length() + 1];
    memcpy(tmp, str.c_str(), str.length());
    tmp[str.length()] = 0;
    return tmp;
}

不,没有别的办法了

一个
std::string
,根据设计,拥有它的缓冲区。如果您不希望数据在字符串消失时消失,则必须将其复制到新的缓冲区中


在这个人为设计的示例中,首先确实不需要
std::string,但我相信您知道这一点,并且有一个更可靠的用例。

不,没有其他方法

一个
std::string
,根据设计,拥有它的缓冲区。如果您不希望数据在字符串消失时消失,则必须将其复制到新的缓冲区中


在这个人为设计的示例中,首先实际上不需要
std::string
,但我相信你知道,并且有一个更坚实的用例。

这似乎并没有任何与SWIFT或C.@边界的关系,我想如果有一种方法,比如把Swift String作为参数,并将其填充到C或C++边上。这样,这是一个基于Swift的问题。一个可能的替代方法是将数组作为存储传递给C函数,比较。我迄今为止看到的最好的包装方法是::这似乎并没有任何与SWIFT或C.@边界的关系,我想如果有一种方法,例如将Swift String作为参数,并将其填充到C或C++边上。这样,这是一个基于Swift的问题。一个可能的替代方法是将数组作为存储传递给C函数compare。