无法在模板函数中使用new[]分配内存。

问题描述 投票:0回答:1

我正试图创建一个分配内存的函数。它分配了内存,但问题是它只是在函数内部分配了内存,但在它返回后,分配的内存就不存在了。几乎就像我在用另一个指针分配内存,但那里应该没有其他指针。

template<class T> struct rmv_ptr { using type = T; };
template<class T> struct rmv_ptr<T*> { using type = T; };
template<class T> struct rmv_ptr<const T*> { using type = T; };

template<class T> bool alloc(T inst, int size)
{
    return (nullptr != (inst = new typename rmv_ptr<T>::type[size]));
}

假如我这样调用。

wchar_t* a;
alloc(a, 10);

inst will be wchar_t*所以 a的指针应该指向分配内存,不是吗?

c++ pointers templates memory-management
1个回答
1
投票

当你把一个整数传给一个函数时,你不能改变这个整数。

当你把一个指针传给一个函数时,你不能改变这个指针。

当你向一个函数传递一个指针时,你可以改变指向的值。

Pass-by-non-const-reference是例外,它允许你改变传递的值。因此,通过引用传递指针允许你改变指针。


在一个无关紧要的问题上,"删除指针 "模板逻辑的基本规则是行不通的。问题在于,你有两个使用 T. 这就是争论 T& inst,它必须符合 T* 所回 new. 即如果 Tint那么 rmv_ptr<int>::typeintnew 将返回一个 int*. 但你不能分配 int*int& inst.


1
投票

指针与非指针没有什么不同,因为当通过值传递给函数时,修改在外部是不可见的。

void foo(int* p) { p = 0; }    // only modifies the local p
void foo(int  a) { a = 0; }    // only modifies the local a

然而,指针允许你修改指针所指向的东西,并且可以被调用者观察到。

// assume p points to an int
void bar(int* p) { *p = 42; }

这不会修改 p 本身。当通过

int x;
int xp = &x;
bar(xp);

然后 p 里面 bar 的副本。xp虽然他们都指向同一个 int.

但当你打电话 new那么 new 返回一个指向分配的内存的指针,所以你需要改变指针的值,而不仅仅是指针的值。要么通过引用传递,要么从函数中返回指针(把它作为参数无论如何都没有用)。

© www.soinside.com 2019 - 2024. All rights reserved.