我正试图创建一个分配内存的函数。它分配了内存,但问题是它只是在函数内部分配了内存,但在它返回后,分配的内存就不存在了。几乎就像我在用另一个指针分配内存,但那里应该没有其他指针。
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
的指针应该指向分配内存,不是吗?
当你把一个整数传给一个函数时,你不能改变这个整数。
当你把一个指针传给一个函数时,你不能改变这个指针。
当你向一个函数传递一个指针时,你可以改变指向的值。
Pass-by-non-const-reference是例外,它允许你改变传递的值。因此,通过引用传递指针允许你改变指针。
在一个无关紧要的问题上,"删除指针 "模板逻辑的基本规则是行不通的。问题在于,你有两个使用 T
. 这就是争论 T& inst
,它必须符合 T*
所回 new
. 即如果 T
是 int
那么 rmv_ptr<int>::type
是 int
和 new
将返回一个 int*
. 但你不能分配 int*
到 int& inst
.
指针与非指针没有什么不同,因为当通过值传递给函数时,修改在外部是不可见的。
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
返回一个指向分配的内存的指针,所以你需要改变指针的值,而不仅仅是指针的值。要么通过引用传递,要么从函数中返回指针(把它作为参数无论如何都没有用)。