2016-05-27 87 views
1

所以我的问题是我想在给定的地址上创建新的对象。C++在方法中创建新对象

MethodA() 
{ 
    TreeNode* nodeResult = NULL; 
    initObject(nodeResult); 
    //nodeResult is NULL anyway 
} 
void initObject(TreeNode* obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

好像是创建新的对象,但在initObject方法的括号结束时删除。

+2

除了@ pw94是正确的答案,这是值得注意的是,对象尚未在你的代码删除了,你刚刚失去了指针。如果你在C++中调用'new'来创建一个对象,它将不会被删除,直到你在一个指针上调用'delete'。现代约定是使用'std :: shared_ptr'和'std :: unique_ptr'来避免必须尽可能手动完成。请仔细阅读它们以及背后的内存管理/所有权概念。 –

+0

@ MatthewWalton的评论应该被添加到其中一个答案中。 –

+0

指针没有什么特别之处。如果你考虑'void initNumber(int x){if(x == 0)x = 42; } void f(){int x = 0; initNumber(X);你会明白发生了什么事。 – molbdnilo

回答

5

你必须使用引用,因为指针是值类型

MethodA() 
{ 
    TreeNode* nodeResult = NULL; 
    initObject(nodeResult); 
    //nodeResult is NULL anyway 
} 
void initObject(TreeNode* & obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 
6

失败的原因是你的initObject方法想要修改调用者的变量,但你通过它的一个副本。将其更改为:

void initObject(TreeNode* &obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

这会给initObject功能的参考给调用者的变量,后函数返回的任何分配到这将是给调用者可见。

1

您需要了解指针是什么。

指针是存储内存块地址的变量。复制指针只是复制地址。

这里:

obj = new TreeNode(); 

你给一个新值obj,新TreeNode的地址,但仅此而已。你不会将它从你的函数中退出。而作为参数TreeNode* objnodeResult的变量副本,它只存储一个地址,nodeResult本身没有改变。

您可以通过使用双指针或reference,像这样解决问题:

void initObject(TreeNode*& obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

那有什么传递给initObject不是nodeResult的副本,但到变量本身的引用,使得它可以修改。

1
TreeNode* nodeResult = NULL; 

是一个包含内存地址的变量。

当您致电initObject(nodeResult);时,您传递该指针的内容,该指针在该位置是NULL。你需要传递它自己的指针,所以在函数调用变量后有一个有效的值。如果你有一个int而不是一个TreeNode*你可以通过int作为&或作为*。同理:

void initObject(TreeNode*& obj) // see it as int& 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

void initObject(TreeNode* * obj) // see it as int* 
{ 
    if(*obj == NULL) 
    { 
     *obj = new TreeNode(); 
    } 
}