首页 > 解决方案 > 如何在类中正确使用智能指针

问题描述

我在 C++ 中创建一棵二叉树,在节点类中使用智能指针时遇到了一些问题。使用普通指针时,一切正常,但使用智能指针时,它就无法正常工作。我认为问题出在插入方法中的这一行:

    '''
    binaryNode* node = this; // This is working
    std::shared_ptr<binaryNode> node {this}; // This throws "double free or corruption" error
    std::shared_ptr<binaryNode> node = shared_from_this (); // This throws "bad weak ptr error", I am correctly inheriting from  enable_shared_from_this
    '''

如何binaryNode* node = this;使用智能指针进行复制?我什至尝试使用public std::enable_shared_from_this<binaryNode>成功。谢谢你的帮助!

编辑:我会尝试更好地解释自己。这是insert()二叉搜索树的功能,看起来像这样(这是 .cpp 文件):

'''
#include "binarynode.h"

binaryNode::binaryNode(int value){
    this->value = value;
    this->right = nullptr;
    this->left = nullptr;
}

void binaryNode::insert(int value){

binaryNode* node = this;
while(true){
    if(value > node->value){
        if(node->right != nullptr){
            node = node->right;
        }else{
            node->right = new binaryNode(value);
            break;
        }
    }else if(value < node->value){
        if(node->left != nullptr){
            node = node->left;
        }else{
            node->left = new binaryNode(value);
            break;
        }
    }else{
        return;
     }
  }

如何使用智能指针复制它?

编辑 2:这是我的 .h 文件:

'''
#ifndef BINARYNODE_H
#define BINARYNODE_H

class binaryNode
{
public:
    int value;
    binaryNode(int value);
    binaryNode* right;
    binaryNode* left;
    void insert(int value);
};

#endif // BINARYNODE_H

这是主文件:

#include <iostream>
#include "binarynode.h"

using namespace std;

void printTree(binaryNode* node){
    if(node == nullptr) return;
    cout << node->value << endl;
    printTree(node->left);
    printTree(node->right);
}

int main(){
    binaryNode* bn = new binaryNode(9);
    bn->insert(4);
    bn->insert(20);
    bn->insert(1);
    bn->insert(6);
    bn->insert(15);
    bn->insert(170);
    printTree(bn);
    return 0;
}

标签: c++classsmart-pointers

解决方案


  1. 您不能多次将相同的原始指针直接转换为共享指针,因为这样您将有几个彼此一无所知的所有者,每个所有者都认为它可以完全控制该对象。这就是为什么std::shared_ptr<binaryNode> node {this}给你一个双重删除。
  2. shared_from_this除非至少有一个共享指针已经指向您的对象,否则您也不能使用。这就是为什么std::shared_ptr<binaryNode> node = shared_from_this ()不起作用。

如果您想要共享指针,请将它们全部共享。例如:

 // binaryNode* bn = new binaryNode(9); <-- nope!
 auto bn = std::make_shared<binaryNode>(9);

 // binaryNode* node = this; <-- nope!
 std::shared_ptr<binaryNode> node = shared_from_this();

我不建议在这里使用共享指针。唯一指针更合适。


推荐阅读