作者maboroshiga (幻)
站内C_and_CPP
标题[问题] 这两个new的差异
时间Tue Dec 8 17:12:28 2009
有一个class叫做ABC,因为在很多class会用到他,
而且他需要初始化一些东西(不是指constructor),
所以我把初始化的code写在另一个可以被共同呼叫的函式
以免把这个code在每个 class 都再写一次
in header: ABC* myABC;
in source: InitABC(myABC);
而函式原本是这样写 但是会错误:
void InitABC(ABC* aABC)
{
aABC = ABC::NewL();
// ...
}
如果改成这样就ok
ABC* InitABC()
{
ABC* aABC = ABC::NewL();
return aABC;
}
并改用 myABC = InitABC();
请问上面这两个的差异是什麽呢?
注: NewL的内容:
ABC* ABC::NewL()
{
ABC* tmp = new ABC();
// ...some code
return tmp;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.204.138.141
※ 编辑: maboroshiga 来自: 123.204.138.141 (12/08 17:13)
1F:→ adrianshum:pass-by-value.... 12/08 17:13
2F:推 VictorTom:你的错误是执行时期错误吧?? 第一种方法请你在initABC之 12/08 17:14
3F:→ VictorTom:後检查看看到底有没有成功new回东西.... 12/08 17:15
4F:→ maboroshiga:所以意思是 第一种方法 在函数之後aABC就被销毁了吗? 12/08 17:17
5F:推 VictorTom:不, 更惨, 它造成memory leak, 直到程式结束由OS回收:) 12/08 17:20
6F:→ VictorTom:常见解决方法除了你的第二种, 一个是用pointer to 12/08 17:21
7F:→ VictorTom:pointer, 即**pABC, 另一个即为pass by reference...:) 12/08 17:21
8F:→ VictorTom:以1F a大的关键字, 与pass by reference去查查资料吧XD 12/08 17:23
9F:推 holymars:void InitABC(ABC* &aABC) 12/08 17:27
10F:推 Cloud:看到NewL应该是写Symbian吧...科科 12/08 17:38
11F:→ maboroshiga:是啊 被发现了XD 不过我知道为什麽1不行了 因为是副本 12/08 18:26
12F:→ tinlans:不说原本的问题,header 直接定义变数你还真敢。 12/08 18:49
13F:→ maboroshiga:myABC是这个class的成员 不能这样定义吗? 12/08 18:54