其他分享
首页 > 其他分享> > c中指针的奇怪行为

c中指针的奇怪行为

作者:互联网

以下结果非常有趣,我很难理解它们.基本上我有一个有int的类:

class TestClass{
public:
    int test;
    TestClass() { test = 0; };
    TestClass(int _test) { test = _test; };
    ~TestClass() { /*do nothing*/ };
};

一个测试函数,它接受TestClass的指针

void testFunction1(TestClass *ref){
    delete ref;
    TestClass *locTest = new TestClass();
    ref = locTest;
    ref->test = 2;
    cout << "test in testFunction1: " << ref->test << endl;
}

这就是我在主要做的事情:

int main(int argc, _TCHAR* argv[])
{
    TestClass *testObj = new TestClass(1);
    cout << "test before: " << testObj->test << endl;
    testFunction1(testObj);
    cout << "test after: " << testObj->test << endl;
    return 0;
}

我期待输出为:

test before: 1
test in testFunction1: 2
test after: 1

但我得到以下输出:

test before: 1
test in testFunction1: 2
test after: 2

有人可以解释一下吗.有趣的是将testFunction1更改为:

void testFunction1(TestClass *ref){
    //delete ref;
    TestClass *locTest = new TestClass();
    ref = locTest;
    ref->test = 2;
    cout << "test in testFunction1: " << ref->test << endl;
}

即我在将其指向新位置之前不删除ref,我得到以下输出:

test before: 1
test in testFunction1: 2
test after: 1

如果有人能解释我这种奇怪的行为,我真的很感激.谢谢.

解决方法:

在删除对象后访问该对象时,行为未定义.

您看到的行为遵循系统中的内存分配算法.

这是在删除第一个testclass对象之后,为新对象分配内存.运行时只是重用内存.

要检查发生了什么,请打印指针的值:

void testFunction1(TestClass *ref){
    cout << ref << endl;
    delete ref;
    TestClass *locTest = new TestClass();
    cout << locTest << endl;
    ref = locTest;
    ref->test = 2;
    cout << "test in testFunction1: " << ref->test << endl;
}

标签:c,pointers,pass-by-reference,memory-leaks
来源: https://codeday.me/bug/20191008/1874848.html