对象指针的副作用

时间:2013-05-29 16:23:14

标签: c++ pointers side-effects

我可以在这个片段中找到问题所在:

我想重置一个函数内部的指针,我只是通过返回指针来实现它的工作原理,但是我无法使它产生副作用(通过指针传递)。

void function(Object * obj)[{
    obj = new Object();
    cout << obj << endl;
    //return obj;
}

main(){
    Object * obj = 0;
    function(obj);
    cout << obj << endl;
}

在这种情况下,结果是:

0x12345678
0

虽然应该是

0x12345678
0x12345678

我尝试使用指针指针或引用指针,但仍然无法通过该函数。虽然只是回归价值就像一个魅力。但我需要在几个参数上执行此操作,并且代码比此处显示的要复杂得多。

3 个答案:

答案 0 :(得分:3)

如果你改变你的函数声明,它应该工作:

void function(Object  * &obj)

在原始代码中,您通过值传递指针,这意味着函数创建了指针的副本,并且不会反映函数中指针的任何更改。当您通过引用传递时,您实际上正在处理原始数据,这可能是使用指针在幕后完成的。

答案 1 :(得分:0)

您可能希望看到this topic

通过指针返回对象(C路):

void function(Object ** obj) {
  *obj = new Object();
}


main(){
  Object * obj = 0;
  function(&obj);
...

通过引用返回对象(C ++方式):

void function(Object *& obj) {
  obj = new Object();
}

main(){
  Object * obj = 0;
  function(obj);
...

答案 2 :(得分:0)

致电

void function(Object * obj){

你正在复制指针obj,换句话说,“function”的堆栈现在拥有一个名为obj的指针的本地副本。当函数返回时,此本地副本将被销毁。 哟可以实现你想要的目标:

void function(Object* obj&){

实际上会通过引用传递调用者的obj指针。现在对obj的任何更改都将反映在调用者的范围中。