Ошибка компилятора при использовании shared_ptr с указателем на указатель - PullRequest
0 голосов
/ 12 апреля 2019

Я новичок в использовании интеллектуальных указателей в C ++, и моя текущая проблема заключается в том, что я конвертирую код C в C ++ (C ++ 11/14/17), и у меня возникают некоторые проблемы с пониманием использования shared_ptr с указателем на указатель.Я получил игрушечный пример, который, как мне кажется, иллюстрирует проблему

Ниже приведен заголовочный файл

#include <memory>
using std::shared_ptr;

struct DataNode
{
  shared_ptr<DataNode> next;
} ;


 struct ProxyNode
 {
   shared_ptr<DataNode> pointers[5];
 } ;


 struct _test_
 {
   ProxyNode** flane_pointers;
  };

И фактический код test.cpp

#include <stdint.h>
#include "test.h"


shared_ptr<DataNode> newNode(uint64_t key);

shared_ptr<ProxyNode> newProxyNode(shared_ptr<DataNode> node);

int main(void)
{
  // Need help converting this to a C++ style calling
  ProxyNode** flane_pointers = (ProxyNode**)malloc(sizeof(ProxyNode*) * 100000);
  // Here is my attempt (incomplete)
  ProxyNode** flane_pointers = new shared_ptr<ProxyNode> ?
  shared_ptr<DataNode> node = newNode(1000);
  flane_pointers[1] = newProxyNode(node)
} 

shared_ptr<ProxyNode> newProxyNode(shared_ptr<DataNode> node) 
{

  shared_ptr<ProxyNode> proxy(new ProxyNode());
 return proxy;
}

shared_ptr<DataNode> newNode(uint64_t key) 
{
 shared_ptr<DataNode> node(new DataNode());
 return node;
}

Яполучение этих ошибок компилятора -

 test.cpp: In function ‘int main()’:
 test.cpp:12:42: error: cannot convert ‘std::shared_ptr<ProxyNode>’ to  ‘ProxyNode*’ in assignment
  flane_pointers[1] = newProxyNode(node)

Скомпилировано с

  g++ -c -g test.h test.cpp

g ++ версия 7.3.0 (в Ubuntu 18)

Мне нужна помощь в преобразовании malloc в стиле CВыделение в стиле C ++ с вызовом указателя на указатель и последующим исправлением ошибок компилятора.Приношу свои извинения, если мне кажется, что я упускаю что-то очевидное.

1 Ответ

2 голосов
/ 12 апреля 2019

Если эта ProxyNode** flane_pointers; должна быть матрицей ProxyNode, то самый простой подход - создать вектор векторов, содержащий ProxyNode, например:

struct DataNode
{
    std::shared_ptr<DataNode> next;
};


struct ProxyNode
{
    // here instead of C style array you can use std::array
    std::shared_ptr<DataNode> pointers[5];
};

TEST(xxx, yyy) {
    std::vector<std::vector<ProxyNode> > matrixOfProxyNodes;
    // insert empty vector of ProxyNode
    matrixOfProxyNodes.push_back(std::vector<ProxyNode>());
    // insert ProxyNode to the first vector of ProxyNodes
    matrixOfProxyNodes[0].push_back(ProxyNode());
    // insert shared_ptr to DataNode in position 0, 0 of matrix of ProxyNodes
    matrixOfProxyNodes[0][0].pointers[0] = std::make_shared<DataNode>();
}

Если вам действительно нужен указатель на указатель (но я действительно не вижу цели для этого), вы можете сделать:

    // create shared pointer to shared pointer to ProxyNode
    // and initialize it to nullptr
    std::shared_ptr<std::shared_ptr<ProxyNode> > ptr2ptr2ProxyNode(nullptr);
    // dynamically create new shared_ptr to ProxyNode
    ptr2ptr2ProxyNode.reset(new std::shared_ptr<ProxyNode>(nullptr));
    // dynamically create ProxyNode
    ptr2ptr2ProxyNode->reset(new ProxyNode());
    (*ptr2ptr2ProxyNode)->pointers[0] = std::make_shared<DataNode>();

Обратите внимание, что std::shared_ptr не ведет себя точно как необработанный указатель, например, вы не должны выделять память для shared_ptr с operator new[]. Здесь объясняется, почему .

Также я вижу, что вы, вероятно, хотите реализовать какой-то список или другую цепочку. std::shared_ptr может страдать от циклической зависимости , поэтому будьте осторожны и используйте std::weak_ptr при необходимости.

...