【发布时间】:2020-06-19 14:45:03
【问题描述】:
假设我使用智能指针?好的,太好了:
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 或在外部范围释放——我只是声明指针并通过引用传递它们。
相反,我为每个指针设置了 2 行:声明、构造它们内部的函数,以及在函数调用后拥有它们的共享 ptr。只是另一个版本的无 malloc 机制。
理想情况下,有一种方法可以删除我使用共享指针拥有 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);
【问题讨论】:
-
使用多返回值而不是输出参数。
-
为什么不使用返回值,比较isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-out。您可以返回
struct或pair,甚至是pair或shared_ptr。顺便说一句,为什么shared_ptr?unique_ptr还不够吗? -
我不太明白“普通 C 指针的外观和感觉,但在外部范围内没有 malloc 或释放”的目的 - 这对 C 和 C++ 可能同样令人困惑/可疑程序员。
-
@Hulk 整个 C++ 世界同样令人困惑和可疑。您的观点被视为根本不使用 C/C++ 的论据
-
@Hulk 这里的重点是控制语言语义。当然,智能指针减少了内存错误的可能性,但增加了一层包装语义和一堆代码重复。我们的想法是要有一个标准,并遵守它。