2015-05-19 23 views
0

考虑到两个示例都在函数内部发生,*p_address= new int(2)和& p_address = &value赋值之间的区别是什么?例如: 我有int指针* original_pointer。我将它的地址传递给函数。在函数内部,我创建了一个int指针,指向2的int值。然后,我将指针(在函数内部创建)分配给* original_pointer。当我在* original_pointer函数外面,它返回-858993460,同时里面的函数返回值为2. 但是,当我用新建在函数里面创建一个指针时,* original_pointer内外功能是一样的。 下面是代码:函数内部的C++指针创建和赋值

int main() { 
    while (true) { 
     void assign_(const int**); 
     char* tmp = " "; 
     int const *original_pointer; 
     assign_(&original_pointer); 
     cout << "the address of original_pointer is " << original_pointer << endl; 
     cout << "the value of original_pointer is " << *original_pointer << endl; 
     cin >> tmp; 
    } 
    return 0; 
} 
void assign_(int const **addr) { 
    int* p_value; 
    int value = 2; 
    p_value = &value; 
    *addr = p_value; 
    //*addr = new RtFloat(2.0); // If I create the pointer this way the value of *addr is the same with *original_pointer 
    cout << "the adress of *addr inside the function is " << *addr << endl; 
    cout << "the value of **addr inside the function is " << **addr << endl; 
} 

回答

1

*p_address= new int(2)分配内存为 2整数 一个INT(值是2),“生命”,直到被删除哪个。

p_address = &value只是将p_address设置为局部变量的地址,该函数在函数退出后立即变为无效(如您所见)。

+1

new int(2)不分配2个整数。新的int [2]没有。 –

+0

@BenjyKessler D'oh。你是对的。将编辑更正。 – John3136

0

*p_address= new int(2)与通过&p_address = &value;分配的区别在第一种情况下,p_address指向的值位于堆上,第二种情况下它位于堆栈上。这意味着在第一种情况下p_address指向的值的生命周期将一直存在,直到它被删除,并且第二种情况下它只会一直存在,直到值超出范围。

+0

* p_address = new int(2) 实际上是一个动态内存分配堆内存中的整数。该程序在堆上创建内存。这基本上意味着地址将保持有效,直到1.程序2明确使用删除[]运算符。流程执行停止。发生这种情况时,操作系统会将内存重新分配给其他进程。大多数现代OS都这样做。 p_address =&value基本上是将变量的地址赋给指针。这被分配到堆栈上。这意味着只要变量在一个范围内,该变量就是有效的。 – Spanky

0

当您使用int value = 2;它在堆栈上创建。一旦函数返回,变量就会自动解除分配。

当您使用*p_address= new int;内存分配在堆上。它不会自动释放。所以即使在函数返回后,内存仍然存在。