使用 ** 或 *& 为函数中的参数分配内存

Allocating memory for an argument in a function using ** or *&

本文关键字:参数 内存 分配 函数 使用      更新时间:2023-10-16

关于如何为函数中的参数分配内存,我看到了两种不同的解决方案:

使用**:

template <class T>
void funcPP(T ** ppnDynamicInt) {
    *ppnDynamicInt = new T;
}

使用*&

template <class T>
void funcRP(T *& pnDynamicInt) {
    pnDynamicInt = new T;
}

使用函数的示例->

int * pnDynamicInt;
funcPP(&pnDynamicInt);
funcRP(pnDynamicInt);//memory leak I know ;)

什么被认为是更安全/更好的风格?一种解决方案是否更有效?

(注意:我知道使用智能指针会更好:)

由于您只是在所示的两个备选方案之间进行考虑,我建议使用funcRP,因为该语言保证pnDynamicInt永远不会为null(引用不能为null),但如果ppnDynamicInt是null指针,*ppnDynamicInt = new T;可能会导致未定义的行为。除此之外,它们是相同的(除了funcRP使用更简洁的语法)

注意:根据您使用函数的方式,您可能需要删除以前的值,例如delete pnDynamicInt

编辑:我所说的"保证"是指没有未定义的方式来拥有null引用,而null指针是定义良好的。

我更喜欢funcPP,因为它在调用站点上更明确地表明指针可能会被更改。