我在使用newdelete运算符时遇到了一个小问题。我读过很多地方,每个new运算符都必须对应一个delete,据我所知,使用new创建的变量将一直存在,直到被该delete击中为止。如果您想看下面的代码,它很长,但是很简单:

#include <iostream>

using namespace std;

int* testFunction1();
int* testFunction2();

int main(){
    int* ptr1 = testFunction1();
    int* ptr2 = testFunction2();

    cout << *ptr1 << endl; // outputs 5
    cout << *(ptr1 - 1) << endl; // outputs random int
    cout << *ptr2 << endl; // outputs random int

    cout << ptr1 << endl; //prints address of b from testFunction1()
    cout << ptr1 - 1 << endl; // prints address of a and c from testFunction1()
    cout << ptr2 << endl; // prints address of a and c from testFunction1()

    cout << endl;

    // delete ptr1; won't work
    return 0;
}

int* testFunction1(){
    int a = 5, b = 10;
    int* pointerToInt1 = new int;
    pointerToInt1 = &a;
    pointerToInt1 = &b;
    cout << &a << endl;
    cout << &b << endl;
    return pointerToInt1;
}

int* testFunction2(){
    int c = 5;
    int* pointerToInt2 = &c;
    cout << &c << endl;
    return pointerToInt2;
}


我有两个问题:


我发现使用testFunction1()可以按值返回指针。但是我不知道如何解决该问题,返回对指针的引用,以便我可以释放main方法(或就此而言,任何其他方法)中的内存。
取消引用*ptr1时为什么得到5作为输出?我的意思是,从地址输出中可以明显看出,在c中分配给testFunction2()的值存储在此处,但是为什么会发生这种情况?

最佳答案

让我们不要把问题放在一边,先解释一下代码。

您声明并定义了一个名为testFunction1的函数,该函数返回int poitner

int* testFunction1(){
    int a = 5, b = 10;             // define local variables with initial values. a,b have different memory addresses
    int* pointerToInt1 = new int;  // dynamic allocate pointer(new address) to int
    pointerToInt1 = &a;            // set pointerToInt1 to point to address of a
    pointerToInt1 = &b;            // set pointerToInt1 to point to address of b
    cout << &a << endl;
    cout << &b << endl;
    return pointerToInt1;          // return pointerToInt1 pointer which currently points to address of b
}


a,b是函数testFunction1中的局部变量,它们具有自动持续时间,当函数完成时它们将被释放,因此pointerToInt1实际上是悬空指针并且对其进行访问是未定义的行为。

另外,在testFunction1中引入了典型的内存泄漏,由new分配的原始内存块丢失了。

int* pointerToInt1 = new int;
pointerToInt1 = &a;


现在,让我们使用"fix"函数testFunction1,是的,我的意思是用双引号引起来。

int* testFunction1(){
    int a = 5, b = 10;
    int* pointerToInt1 = new int;
    *pointerToInt1 = a;             // copy a to memory pointerToInt1
    *pointerToInt1 = b;             // copy b to memory pointerToInt1
    cout << &a << endl;
    cout << &b << endl;
    return pointerToInt1;           // return pointerToInt1 pointer
}


调用函数testFunction1之后,您仍然需要删除动态分配的内存块。

int *p = testFunction1();
delete p;


现在,如果您返回并回顾两个问题,您会得到答案吗?

关于c++ - 新建和删除混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14544610/

10-12 00:44