假设我使用智能指针? 好的,很好:
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);
您的问题可能可以通过一个结构来解决,该结构具有一个或两个构造函数:
struct NoNeadachesWhatsoever {
shared_ptr<double> asp;
shared_ptr<int> bsp;
shared_ptr<T> csp;
NoNeadachesWhatsoever() {
// initialize members.
}
};
// ...
NoNeadachesWhatsoever no_headaches_whatsoever;