新的动态分配与正常分配
new dynamic allocation vs normal allocation
这两种方法有什么区别?
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;
}
}
其中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;
}
}
现在它起作用了。我缺少指针的基本原则,我似乎无法猜测它是。
这里也是测试类:
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 的地址并将其保存到本地指针温度。
制造
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 取消分配动态分配的字符数组的析构函数
- 我可以使用std ::分配的分配的原始数组
- 安全分配堆栈分配的阵列
- 我可以动态分配以前分配的内存,但用不同的指针分配
- 有没有一种方法可以全局填充新分配/删除分配
- 在 c++ 中为字符串分配其分配的大小值是否正确
- 编译器控件如何帮助分配和解分配C++内存?
- 按乘积分配(乘法分配),以C++递增或递减
- 加载程序如何从动态模块分配/取消分配静态数据
- 为什么在分配/解除分配许多小对象后内存不可重用
- 分配动态分配的指针数组
- 在单个分配中分配包含字符串的结构
- 将分配/解除分配多维数组从 C++ 转换为 C
- 是否有比 boost::object_pool 更快的 C++ 堆分配/解除分配机制
- Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面
- 为什么我可以通过重复分配和解分配内存来耗尽系统的所有内存?
- cpputest错误消息分配/解除分配
- 如何在标准模板库中分配/取消分配对象
- 是未使用在堆栈或堆上分配"new"分配的对象