这两种方法有什么区别?
Method(CustomClass t)
{
CustomClass *temp = &t;
}
这样称呼
Method(CustomClass(1,2,3));
和
Method(CustomClass* t)
{
CustomClass *temp = t;
}
这样称呼
Method(new CustomClass(1,2,3));
我几年没有用c ++编写代码而且记不起来了。我来自c#,每个类都需要动态分配'new'。问题在于,我没有考虑动态地将对象与“新”对齐并正常调用它之间的区别。两个例子中的温度有何不同?
更具体的例子:我正在创建一个链接列表,对于我的列表,我有这个方法:
void List::AddNew(TestClass node)
{
if (!first)
{
first = &node;
}
else
{
bool setFirst = false;
if (!last)
setFirst = true;
TestClass *temp;
temp = last;
last = &node;
if (temp)
temp->next = last;
if (setFirst)
first->next = last;
}
}
其中first
和last
为TestClass *
;列表没有正确初始化(第一个和最后一个指向相同的值),我不知道为什么,所以我改变了方法:
void List::AddNew(TestClass* node)
{
if (!first)
{
first = node;
}
else
{
bool setFirst = false;
if (!last)
setFirst = true;
TestClass *temp;
temp = last;
last = node;
if (temp)
temp->next = last;
if (setFirst)
first->next = last;
}
}
现在它有效。我错过了指针的基本原则,我似乎无法猜测它是什么。
这里也是TestClass:
class TestClass
{
public:
int x, y;
TestClass *next;
TestClass *prev;
TestClass();
TestClass(int,int);
~TestClass();
};
答案 0 :(得分:1)
这两种方法有什么区别?
其中一个是使用堆栈(自动)分配,而另一个是使用堆(动态)分配。
Method(CustomClass(1,2,3)); // stack based
Method(new CustomClass(1,2,3)); // heap based
如果您要使用new
,则需要确保delete
也引用{{1}}。否则,你会有内存泄漏。
是的,我知道这个,但是真正的干涉是什么 分配以及何时使用其中一种?
对象生命周期。如果你在堆栈上放了一些东西,你只能在特定的函数中使用它,并且它下面的任何函数都需要它作为参数传递。如果将它放在堆上,则可以返回对它的引用并在任何需要的地方使用它。您不能将引用/地址返回给堆栈变量,因为它的生命在函数返回时结束。
答案 1 :(得分:1)
我认为你最关心何时使用动态分配与何时使用堆栈分配。唯一要知道的是,在不需要基于动态的分配时,应该使用基于堆栈的分配。什么时候需要动态(或堆)分配?好吧,通常当你需要一个对象存在于创建它的范围之外,或者当动态分配的对象的内容依赖于严格的运行时机制(比如向向量添加元素(大小)时,你会使用它可能在编译时不知道))。此外,这...
T* t = &t;
不是堆分配。这只是一个指针,其自动存储持续时间(在堆栈上)指向堆栈上的另一个对象(如果t
本身是基于堆栈的)。堆上的分配仅在使用new
时发生。
答案 2 :(得分:0)
CustomClass * temp; temp只是一个指针。它指向NULL(好吧,实际上它可以指向任何地方,但如果没有对象则应将其设置为NULL)或指向已经现有类。
CustomClass tmp; 创建一个对象。
方法(CustomClass * t): 对已存在的Object的需求(t =指向现有对象的指针)。
CustomClass * temp = t; 将指针指定给新的本地指针。
方法(CustomClass t): 应该创建你传递的类的副本(不确定......)
CustomClass * temp =& t; &安培; =地址操作员。检索t的地址并将其保存到本地指针temp。
MFG