例如,我现在有一个结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
我首先有一个指针,但是我没有为它分配空间,所以
TreeNode* p;
我想稍后再分配空间,例如在另一个函数中,如下所示
void allo(TreeNode* p, int val){
p = new TreeNode(val);
}
allo(p,5);
// I want to get the original p here
但是这个new
方法改变了原始p
的地址,我再也找不到它了。那么,有没有一种无需更改地址即可分配的方法?局限性是我想将定义和分配分开,例如,像上面一样,例如,在函数外部定义并在函数内部分配。
答案 0 :(得分:4)
如果要在此函数之外管理此指针,则需要通过引用传递参数。否则,将指针的副本传递给函数validAnswerIds
。此复制更改了指针。
尝试这样(如果我理解问题的实质):
allo
答案 1 :(得分:1)
首先:
您不应使用原始拥有的指针,而应使用智能指针,例如std::unique_ptr<>
或std::shared_ptr<>
或RAII容器。
您的函数allo()
对传递给它的指针没有任何作用,因为它按值(复制)获取指针,并且allo()
不可能神奇地改变您传递的指针的地址它也不是价值。更改的只是参数p
的值,该值在函数中是本地的,因此有效分配的内存会泄漏。
可以通过引用传递参数,以便可以在函数中对其进行更改:
void allo(TreeNode* &ptr, int val)
{
ptr = new TreeNode(val);
}
TreeNode *p{ nullptr }; // you shouldn't leave pointers uninitialized
// ...
allo(p, 42);
或返回值:
TreeNode* allo(int val)
{
return new TreeNode(val);
}
// ...
TreeNode *p{ nullptr };
// ...
p = allo(42);
在两种情况下,p
均指向函数调用后在allo()
中分配的对象。