提问者:小点点

C++:通过引用传递共享ptr而不破坏共享?


假设我使用智能指针? 好的,很好:

shared_ptr<whatever>(new whatever());

现在,我想做以下事情,而不是纠结于C++的单返回项策略和其中的语义混乱:

void do_something(whatever *& A, whatever *& B){
  auto Aptr = shared_ptr<whatever>(new whatever());
  A = Aptr.get();

  auto Bptr = shared_ptr<whatever>(new whatever());
  B = Bptr.get();
}

但是,shared_ptr机械师会在对象通过引用传递出函数时删除这些对象,这样,当我的调用代码中的指针,

whatever *A,*B;
do_something(A,B);

通过引用设置到适当的地址,则数据已被删除。

所有这些都是为了避免返回类型的输入和文档的混乱,因为在列表中积累参数是非常自然的。。。但是返回任务栏中的每一个附加项都将上下文提示拆分到文档中。

访问通过引用初始化的值是一种理想的方法。

此外,我想补充的是,我已经让这个机械师工作,只要我拥有与调用范围中的共享指针的指针。

然而,这是同一个问题的递归重复:我想自动管理函数内部的指针,并通过引用外部变量返回它们,这样就有了普通C指针的外观和感觉,但在外部作用域没有mallocs或free--我只是声明指针并通过引用传递它们。

相反,每个指针都有2行:声明,构造它们内部的函数,以及拥有它们的共享ptr*在函数调用之后。 只是另一个版本的无马洛克机械师。

理想情况下,有一种方法可以删除我拥有带有共享指针的ptr的第二行,或者(如果不可能的话),在声明外部共享指针之后,在函数内部初始化共享指针。 注意,这里的目标是:

void func(double * a, int * b, T * c);

double *a; 
int *b; 
T *c;
func(a,b,c); 
// no headaches whatsoever at this scope.

// versus

double *a; 
int *b; 
T *c;
func(a,b,c);
shared_ptr<double> asp(a);
shared_ptr<int> bsp(b);
shared_ptr<T> csp(c,[](T*_){/*special T deletion process*/;};

// versus

double *a; 
int *b; 
T *c;
func(a,b,c);

/* solve the universe */

free(a);
free(b);
delete(T);

共1个答案

匿名用户

您的问题可能可以通过一个结构来解决,该结构具有一个或两个构造函数:

struct NoNeadachesWhatsoever {
    shared_ptr<double> asp;
    shared_ptr<int> bsp;
    shared_ptr<T> csp;

    NoNeadachesWhatsoever() {
        // initialize members.
    }
};

// ...

NoNeadachesWhatsoever no_headaches_whatsoever;

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|引用|传递|共享|ptr|破坏|共享)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?