创建C++;来自C包装器的对象 我有一个关于从C包装器返回C++对象的指针的问题。p> 这里有两个C++类:代码> A >代码> B/COD>。我主要想从B创建A的实例 class A { private: int a; public: explicit A(int a) : a(a) {}; int getA() const { return a; } void setA(int a) { A::a = a; } }; class B { private: int b; public: explicit B(int b) : b(b) {}; int getB() const { return b; } void setB(int b) { B::b = b; } A createA() { return A(getB()); // A will be a complicated object that must be created from B } };

创建C++;来自C包装器的对象 我有一个关于从C包装器返回C++对象的指针的问题。p> 这里有两个C++类:代码> A >代码> B/COD>。我主要想从B创建A的实例 class A { private: int a; public: explicit A(int a) : a(a) {}; int getA() const { return a; } void setA(int a) { A::a = a; } }; class B { private: int b; public: explicit B(int b) : b(b) {}; int getB() const { return b; } void setB(int b) { B::b = b; } A createA() { return A(getB()); // A will be a complicated object that must be created from B } };,c++,c,pointers,C++,C,Pointers,和C包装器 extern "C" { int A_get_a(A *a) { return a->getA(); } A *B_getA_1(B *b) { A a = b->createA(); A *a_ptr = &a; return a_ptr; } void B_getA_2(B *b, A* a_ptr) { A a = b->createA(); a_ptr = &a; } } 在B_getA_1

和C包装器

extern "C" {
int A_get_a(A *a) {
    return a->getA();
}
A *B_getA_1(B *b) {
    A a = b->createA();
    A *a_ptr = &a;
    return a_ptr;
}
void B_getA_2(B *b, A* a_ptr) {
    A a = b->createA();
    a_ptr = &a;
}
}

B_getA_1
中,静态分析器抱怨

Address of local variable may escape the function.
大概是因为范围问题。但是,在
B_getA_2
中,通过以下方式使用该功能时:

int main() {

    B b(4);
    A* a;
    B_getA_2(&b, a); // <--

    return 0;
};

那么,从
B
创建
a
实例的好方法是什么呢

在任何情况下,这:

A a = b->createA();
a_ptr = &a;
return;
…将在堆栈上分配
a
,获取其地址,将其返回给调用方,然后销毁
a
,因为它是一个局部变量。因此,指针将指向无效内存

您可以返回对象本身(而不是返回指向该对象的指针),或者动态分配内存,将该对象复制到该对象并返回指向该动态分配区域的指针。

第二个问题:

void B_getA_2(B *b, A* a_ptr) {
    A a = b->createA();
    a_ptr = &a;   // this will have no effect, a_ptr is a local variable
}
你可能想要这个:

 void B_getA_2(B *b, A **a_ptr) {
        A a = b->createA();
        *a_ptr = &a;
    }

 ...
 B_getA_2(&b, &a);

但这也是错误的,因为现在返回一个指向局部变量的指针,请参见。

此函数得到的警告:

A *B_getA_1(B *b) {
    A a = b->createA();
    A *a_ptr = &a;
    return a_ptr;
}
void B_getA_2(B *b, A* a_ptr) {
    A a = b->createA();
    a_ptr = &a;
}
B_getA_2(&b, &a); 
是因为您正在返回局部变量的地址。该变量的生存期在函数退出时结束,因此返回的指针无效。正在尝试取消对指针调用的引用

此功能存在相关问题:

A *B_getA_1(B *b) {
    A a = b->createA();
    A *a_ptr = &a;
    return a_ptr;
}
void B_getA_2(B *b, A* a_ptr) {
    A a = b->createA();
    a_ptr = &a;
}
B_getA_2(&b, &a); 
在这里,您将为
a_ptr
分配一个值,该值是一个参数,因此是函数的本地值,这意味着它不会影响
main
中的
a
。您需要传递
a
的地址,并将其分配给取消引用的指针。但同样,您将导出一个局部变量的地址,该变量的生存期在函数退出时结束

您需要更改
createA
以返回指向动态分配对象的指针:

A *createA() {
    return new A(getB());
}
然后更改包装器函数以返回:

A *B_getA_1(B *b) {
    return b->createA();
}
void B_getA_2(B *b, A **a_ptr) {
    *a_ptr = b->createA();
}
并更改调用第二个函数的方式:

A *B_getA_1(B *b) {
    A a = b->createA();
    A *a_ptr = &a;
    return a_ptr;
}
void B_getA_2(B *b, A* a_ptr) {
    A a = b->createA();
    a_ptr = &a;
}
B_getA_2(&b, &a); 
还应为此返回的指针公开清理函数:

void free_A(A *a)
{
    delete a;
}