如何在不更改cpp地址的情况下分配空间?

时间:2018-11-16 07:29:34

标签: c++ pointers memory-management

例如,我现在有一个结构

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的地址,我再也找不到它了。那么,有没有一种无需更改地址即可分配的方法?局限性是我想将定义和分配分开,例如,像上面一样,例如,在函数外部定义并在函数内部分配。

2 个答案:

答案 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()中分配的对象。