美文网首页
unique_ptr解惑

unique_ptr解惑

作者: 413x | 来源:发表于2019-07-31 14:56 被阅读0次

通过这个例子,我意识到编写代码验证,是学习一门语言的最好方法。
结论:
若一个类中有一个私有成员std::unique_ptr,当该实例被析构时,若该类的析构函数为虚函数,即使析构函数中未编写对unique_ptr指向对象进行析构的代码,编译器会在该类析构时调用相关unique_ptr指向对象的析构函数,若析构函数不是虚函数,则会导致new-delete释放错误。

#include <iostream>
#include <bits/unique_ptr.h>

class KeyFetcher {
public:
    virtual ~KeyFetcher(){
        std::cout << "KeyFetacher destruct" << std::endl;
    }
};

class LicenseFetcher {
public:
    virtual ~LicenseFetcher(){
        std::cout << "LicenseFetcher destruct" << std::endl;
    }
};

class ClearKeyLicenseFetcher : public LicenseFetcher{
public:
    virtual ~ClearKeyLicenseFetcher(){
        std::cout << "ClearKeyLicenseFetcher destruct" << std::endl;
    }
};

class ClearKeyFetcher : public  KeyFetcher{
public:
    ClearKeyFetcher(
            std::unique_ptr<LicenseFetcher> license_fetcher) :
            license_fetcher_(std::move(license_fetcher)){}
    virtual ~ClearKeyFetcher(){
        std::cout << "ClearKeyFetcher destruct" << std::endl;
    }
private:
    std::unique_ptr<LicenseFetcher> license_fetcher_;
};

class ClearKeyCasPlugin{
private:
    std::unique_ptr<KeyFetcher> mKeyFetcher;
public:
    virtual ~ClearKeyCasPlugin(){

    }
    void test(){
        std::unique_ptr<ClearKeyLicenseFetcher> license_fetcher;
        license_fetcher.reset(new ClearKeyLicenseFetcher());
        std::unique_ptr<ClearKeyFetcher> key_fetcher;
        key_fetcher.reset(new ClearKeyFetcher(std::move(license_fetcher)));
        mKeyFetcher = std::move(key_fetcher);
    }
};



int main() {

    ClearKeyCasPlugin* p=new ClearKeyCasPlugin();
    for(int i=0;i<2;i++){
        p->test();
        std::cout << "----------------------------" << std::endl;
    }
    delete(p);
    return 0;
}

上述是我怀疑存在内存泄露的代码改编而成,通过asan检测不存在内存泄漏,总结如下:
若一个类中有一个私有成员std::unique_ptr,当该实例被析构时,若该类的析构函数为虚函数,即使析构函数中未编写对unique_ptr指向对象进行析构的代码,编译器会在该类析构时调用相关unique_ptr指向对象的析构函数,若析构函数不是虚函数,则会导致new-delete释放错误。还要关注析构顺序的问题

相关文章

  • unique_ptr解惑

    通过这个例子,我意识到编写代码验证,是学习一门语言的最好方法。结论:若一个类中有一个私有成员std::unique...

  • unique_ptr 实现

    unique_ptr unique_ptr 简单实现

  • C++智能指针

    unique_ptr std::unique_ptr 是通过指针占有并管理另一对象,并在 unique_ptr 离...

  • 智能指针

    一、auto_ptr 二、unique_ptr 函数传参的情景—— void func(unique_ptr

  • C++ Smart Pointers - Transferrin

    The basic idea of a unique_ptr is that there exists only ...

  • modern c++(5)-智能指针

    auto_ptr与unique_ptr auto_ptr与unique_ptr都是独占所有权的智能指针类型,前者由...

  • C++11智能指针:unique_ptr

    unique_ptr 1.概念 unique_ptr形如其名,与所指对象的内存紧密地绑定,不能与其他的unique...

  • 智能指针

    memory include auto_PTR unique_ptr

  • 右值,右值引用,move

    问题构造函数接受一个unique_ptr的参数。 如果是定义一个unique_ptr然后直接传入,会报错。像这样。...

  • c++11智能指针(二) unique_ptr

    unique_ptr是一个独占指针,它不允许其他的智能指针共享其内部的指针。例如 初始化unique_ptr 指定...

网友评论

      本文标题:unique_ptr解惑

      本文链接:https://www.haomeiwen.com/subject/rrftdctx.html