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;
}
Run Code Online (Sandbox Code Playgroud)
我有一个名为t的结构,以及一个名为test的函数.
在main()中,我有
t **ppT = NULL;
test(ppT);
cout << ppT << " " << *ppT << endl;
cout << ppT << " " << *ppT << endl;
Run Code Online (Sandbox Code Playgroud)
如果我在测试中使用malloc ,它可以工作.但是,如果我在测试中使用new ,它会告诉我
0049FCC8 0074C378
0049FCC8 CCCCCCCC
Run Code Online (Sandbox Code Playgroud)
有什么问题?此外,我使用Visual Studio 2013作为我的编译器.
因为在test函数中变量pT是本地的,并且一旦函数返回它将超出范围.&pT从函数返回后,指向它的指针将变为无效,并且尝试使用它将导致未定义的行为.
这只是问题的一半,另一个是你将空指针传递给函数,并在函数内取消引用它.当您通过引用模拟传递时(通过使用指向指针的方法),您需要在指针上使用address-of运算符,如
t* pA = 0;
test(&pT);
Run Code Online (Sandbox Code Playgroud)
这也引出了一个问题,为什么你使用对指针指针的引用,而不仅仅是对指针的引用,如
void test(t*& pT);
...
t* pT = nullptr;
test(pT);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |