新动态分配与正常分配

时间:2013-11-10 23:17:25

标签: c++

这两种方法有什么区别?

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


}

其中firstlastTestClass *;列表没有正确初始化(第一个和最后一个指向相同的值),我不知道为什么,所以我改变了方法:

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();

};

3 个答案:

答案 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