新的动态分配与正常分配

new dynamic allocation vs normal allocation

本文关键字:分配 常分配 动态分配      更新时间:2023-10-16

这两种方法有什么区别?

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"动态分配。问题是我不理解使用"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;
    }

}

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

}

现在它起作用了。我缺少指针的基本原则,我似乎无法猜测它是。

这里也是测试类:

class TestClass
{
public:
    int x, y;
    TestClass *next;
    TestClass *prev;
    TestClass();
    TestClass(int,int);
    ~TestClass();
};

这两种方法有什么区别?

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

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

如果要使用new则需要确保也delete该引用。否则,将出现内存泄漏。

是的,我知道这一点,但是 分配以及何时应使用其中一个?

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

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

T* t = &t;

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

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

定制类 tmp;创建一个对象。

方法(自定义类* t):对现有对象的需求(t = 指向现有对象的指针)。

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

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

自定义类 *温度 = &t;&= 地址操作员。检索 t 的地址并将其保存到本地指针温度。

制造