C++ C++;在方法中创建新对象
所以我的问题是,我想在给定地址上创建新对象C++ C++;在方法中创建新对象,c++,C++,所以我的问题是,我想在给定地址上创建新对象 MethodA() { TreeNode* nodeResult = NULL; initObject(nodeResult); //nodeResult is NULL anyway } void initObject(TreeNode* obj) { if(obj == NULL) { obj = new TreeNode(); } } 新对象似乎已创建,但在initObject方法的方括
MethodA()
{
TreeNode* nodeResult = NULL;
initObject(nodeResult);
//nodeResult is NULL anyway
}
void initObject(TreeNode* obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
新对象似乎已创建,但在
initObject
方法的方括号末尾被删除。您必须使用引用,因为指针是值类型
MethodA()
{
TreeNode* nodeResult = NULL;
initObject(nodeResult);
//nodeResult is NULL anyway
}
void initObject(TreeNode* & obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
您必须使用引用,因为指针是值类型
MethodA()
{
TreeNode* nodeResult = NULL;
initObject(nodeResult);
//nodeResult is NULL anyway
}
void initObject(TreeNode* & obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
这会失败,因为您的
initObject
方法想要修改调用方的变量,但您正在传递它的副本。将其更改为:
void initObject(TreeNode* &obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
这将为
initObject
函数提供对调用方变量的引用,并且在函数返回后调用方可以看到对它的任何赋值。这将失败,因为initObject
方法想要修改调用方的变量,但您正在传递它的副本。将其更改为:
void initObject(TreeNode* &obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
这将为
initObject
函数提供对调用方变量的引用,并且在函数返回后,调用方可以看到对它的任何赋值。您需要了解指针是什么
指针是存储内存块地址的变量。复制指针只是复制地址
在这里:
您给obj
一个新值,即新TreeNode
的地址,但仅此而已。您不会从函数中返回它。由于参数TreeNode*obj
是只存储地址的nodeResult
的变量副本,nodeResult
本身没有改变
您可以使用双指针或a来解决问题,如下所示:
void initObject(TreeNode*& obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
然后传递给
initObject
的不是nodeResult
的副本,而是对变量本身的引用,使其可修改。您需要了解指针是什么
TreeNode* nodeResult = NULL;
指针是存储内存块地址的变量。复制指针只是复制地址
在这里:
您给obj
一个新值,即新TreeNode
的地址,但仅此而已。您不会从函数中返回它。由于参数TreeNode*obj
是只存储地址的nodeResult
的变量副本,nodeResult
本身没有改变
您可以使用双指针或a来解决问题,如下所示:
void initObject(TreeNode*& obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
然后传递给initObject
的不是nodeResult
的副本,而是对变量本身的引用,使其可修改
TreeNode* nodeResult = NULL;
是一个包含内存地址的变量
调用initObject(nodeResult)时
传递该指针的内容,该指针在该点处为NULL
。您需要将指针自身传递给它,以便在函数调用后变量具有有效值。如果您使用的是int
而不是TreeNode*
,则将int
作为&
或*
传递。同样地:
void initObject(TreeNode*& obj) // see it as int&
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
或
是一个包含内存地址的变量
调用initObject(nodeResult)时
传递该指针的内容,该指针在该点处为NULL
。您需要将指针自身传递给它,以便在函数调用后变量具有有效值。如果您使用的是int
而不是TreeNode*
,则将int
作为&
或*
传递。同样地:
void initObject(TreeNode*& obj) // see it as int&
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
或
除了@pw94的正确答案之外,值得注意的是,该对象没有在代码中被删除,只是丢失了指向它的指针。如果你在C++中调用<代码>新< /代码>来制作一个对象,它将不会被删除,直到你在指针上调用<代码>删除>代码>。现代惯例是利用
std::shared_ptr
和std::unique_ptr
尽可能避免手动操作。一定要仔细阅读它们及其背后的内存管理/所有权概念。@MatthewWalton的评论应该添加到其中一个答案中。指针没有什么特别之处。如果您考虑<代码>空隙INITIONT(int x){if(x=0)x=42;}无效f*){int x=0;INITUTE(x);},您将了解发生了什么。除了@ pW91的正确答案之外,值得注意的是,该对象还没有在代码中被删除,您刚刚丢失了指向它的指针。如果你在C++中调用<代码>新< /代码>来制作一个对象,它将不会被删除,直到你在指针上调用<代码>删除>代码>。现代惯例是利用std::shared_ptr
和std::unique_ptr
尽可能避免手动操作。一定要仔细阅读它们及其背后的内存管理/所有权概念。@MatthewWalton的评论应该添加到其中一个答案中。指针没有什么特别之处。如果考虑<代码>空隙INITUTION(int x){if(x=0)x=42;}无效f*({int x=0;INITUTHORE(x);}),您将了解发生了什么。