c++ - 如何使用智能指针围绕 C 'objects' 实现包装器?

标签 c++ c pointers memory smart-pointers

我正在使用一个 C 库,它使用来自 C++ 的原始指针。因此,我正在考虑将所有指向 C 对象的指针包装在 C++ 类中并将它们转换为智能指针。我已经建立了一个工作示例:

#include <iostream>
using namespace std;

// the C library is oop: using structs and naming conventions. Like this: 

// C library declarations
struct Animal_s {
    int age;
};
typedef struct Animal_s Animal;

Animal* make_animal(int age);

void free_animal(Animal* animal);

Animal* do_something_with_animal(Animal* animal);



// C lib implementations
Animal* make_animal(int age ){
    auto* animal = (Animal*) malloc(sizeof(Animal));
    animal->age = age;
    return animal;
}

void free_animal(Animal *animal){
    free(animal);
}

Animal* do_something_with_animal(Animal* animal){
    //...
    return animal;
}



// C++ wrapper 
class AnimalWrapper{
    Animal* animal_; // how to use smart pointers? 

public:
    explicit AnimalWrapper(int age){
        animal_ = make_animal(age);
    };

    ~AnimalWrapper(){
        free_animal(animal_);
    }

    AnimalWrapper(const AnimalWrapper& animalWrapper){
        if (this != &animalWrapper){
            animal_ = animalWrapper.animal_;
        }
    }

    AnimalWrapper(AnimalWrapper&& animalWrapper) noexcept {
        if (this != &animalWrapper){
            animal_ = animalWrapper.animal_;
        }
    }
    AnimalWrapper& operator=(const AnimalWrapper& animalWrapper)  {
        if (this != &animalWrapper){
            animal_ = animalWrapper.animal_;
        }
        return *this;
    }

    AnimalWrapper& operator=(AnimalWrapper&& animalWrapper) noexcept {
        if (this != &animalWrapper){
            animal_ = animalWrapper.animal_;
        }
        return *this;
    }

    Animal *getAnimal() const {
        return animal_;
    }

    Animal* doSomethingWithAnimal(){
        return do_something_with_animal(animal_);
    }
};



int main(){

    AnimalWrapper animalWrapper(6);


    return 0;
};


这个例子有效,根据 valgrind,正确管理内存。但是,是否可以使用智能指针实现包装类?或者我必须手动管理包装类中的内存?

最佳答案

您可以使用 std::unique_ptr 用于管理 Animal 的生命周期对象:

#include <memory>

struct FreeAnimal {
    void operator()(Animal* a) const noexcept {
        free_animal(a);
    }
};

using AnimalPtr = std::unique_ptr<Animal, FreeAnimal>;

int main() {
    AnimalPtr party_animal{make_animal(21)};

    do_something_with_animal(&*party_animal);
    // or
    do_something_with_animal(party_animal.get());
}

关于c++ - 如何使用智能指针围绕 C 'objects' 实现包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61850433/

相关文章:

c++ - Qt 中的打印预览

c - 如果 char c = 0x80,为什么 printf ("%d\n", c << 1) 输出 -256?

c++ - 将内存池中的malloc和free替换为new和delete

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

C 错误 - '...' token 之前需要声明说明符或 '*'

c++ - boost最短路径查找算法

c++ - 通过 g++ 编译将 .so 文件链接到 .cpp 文件

c++ - Char 数组上的累积按位或

c - 如何在 Ubuntu 中生成核心转储文件

pointers - 在 Golang 错误中从一个指针类型转换为另一种指针类型