0

这两种方法有什么区别?

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”动态分配对象和正常调用它之间的区别。两个示例中的 temp 有何不同?

更具体的例子:我正在创建一个链接列表,对于我的列表我有这个方法:

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;
    }


}

在哪里firstlast在哪里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();

};
4

3 回答 3

1

这两种方法有什么区别?

其中之一是使用堆栈(自动)分配,而另一个是使用堆(动态)分配。

Method(CustomClass(1,2,3)); // stack based

Method(new CustomClass(1,2,3)); // heap based

如果你要使用new你需要确保你delete也参考。否则,您将有内存泄漏。

是的,我知道这一点,但分配之间的真正区别是什么?我什么时候应该使用其中一个?

对象生命周期。如果你把一些东西放在堆栈上,你将只能在一个特定的函数中使用它,并且它下面的任何函数都需要它作为参数传递。如果你把它放在堆上,你可以返回对它的引用并在任何你想要的地方使用它。您不能将引用/地址返回给堆栈变量,因为它的生命在函数返回时结束。

于 2013-11-10T23:28:21.217 回答
1

我认为您对何时使用动态分配与何时使用堆栈分配感到最困惑。唯一要知道的是,当不需要基于动态的分配时,您应该使用基于堆栈的分配。您问什么时候需要动态(或堆)分配?好吧,通常当您需要一个对象存在于它创建的范围之外,或者当该动态分配对象的内容依赖于严格的运行时机制时(例如向向量添加元素(大小在编译时可能不知道))。还有,这...

T* t = &t;

不是堆分配。这只是一个具有自动存储持续时间(在堆栈上)的指针,指向堆栈上的另一个对象(如果t它本身是基于堆栈的)。堆上的分配仅在new使用时发生。

于 2013-11-11T15:32:26.147 回答
0

自定义类 *temp; temp 只是一个指针。它指向 NULL(好吧,实际上它可以指向任何地方,但如果不存在对象,则应将其设置为 NULL)或存在的类。

自定义类 tmp; 创建一个对象。

Method(CustomClass* t):要求一个已经存在的对象(t = 指向现有对象的指针)。

自定义类 *temp = t; 将指针分配给新的本地指针。

方法(CustomClass t): 应该创建您传递的类的副本(不确定......)

自定义类 *temp = &t; & = 地址运算符。检索 t 的地址并将其保存到本地指针 temp。

制造

于 2013-11-10T23:27:28.657 回答