struct t{
int a;
t(int i){
a = i;
}
};
void test(t**& ppT){
t *pT = (t*)malloc(sizeof(t));
pT->a = 100;//works
t *pT = new t(100);//doesn't work
ppT = &pT;
}
我有一个名为 t 的结构,以及一个名为 test 的函数。
在main()中,我有
t **ppT = NULL;
test(ppT);
cout << ppT << " " << *ppT << endl;
cout << ppT << " " << *ppT << endl;
如果我在 test 中使用malloc,它可以工作。 但是,如果我在 test 中使用new,它会显示
0049FCC8 0074C378
0049FCC8 CCCCCCCC
问题是什么?此外,我使用Visual Studio 2013作为我的编译器。
答案 0 :(得分:5)
因为在test
函数中,变量pT
是本地的,并且一旦函数返回它将超出范围。从函数返回后,使用&pT
获得的指针将变为无效,并且尝试使用它将导致未定义的行为。
这只是 half 的问题,另一个是你将空指针传递给函数,并在函数内取消引用它。当您通过引用模拟传递(通过使用指向指针的方法)时,您需要在指针上使用address-of运算符,例如
t* pA = 0;
test(&pT);
这也引出了一个问题,为什么你使用对指针指针的引用,而不仅仅是对指针的引用,比如
void test(t*& pT);
...
t* pT = nullptr;
test(pT);