按指针分配动态内存
指针与动态内存分配之间的联系是什么。为什么我们使用指针 动态内存分配。每当我们使用new运算符时我们只使用指针变量为什么? 谁能解释一个例子
答案 0 :(得分:1)
根据你的问题开始,你不需要编程,而是现实生活中的例子。
想象一下,你住在普通的公寓里,它有自己的地址,门上你可以看到“Robin Mandela”的大牌。这就像静态内存分配。在你的程序开始时,你有一些内存空间和一个与之相关的名字。每次度假,您都会飞往其他国家,在那里您可以在酒店租房。您可以在一个房间住一年,在另一个房间住另一年,甚至可以在度假期间更换房间。你甚至可能不会真正对你将居住在哪个房间感兴趣,但你需要知道你确实会有一个居住的房间。
当你要求动态内存分配时,你会得到一些内存。这个记忆几乎可以分配到任何地方,比如酒店的房间,当然你需要一个带数字的钥匙才能知道在哪里找到它。指针就像键上的那个数字 - 它允许您访问分配的数据。 也有一年你可能决定不去度假并租一间房。你不能用你的公寓做到这一点 - 你刚刚得到它,住在那里或不住。这就像程序中的静态内存。
答案 1 :(得分:0)
自动和静态存储持续时间的对象的大小和位置(内存地址)在编译时是已知的。可以通过变量访问对象,编译器会隐式处理内存。
另一方面,动态内存在运行时分配,顾名思义。因为它发生在运行时,编译器无法知道内存的分配位置,因此无法为您处理内存。您必须使用它的地址访问内存。
如何获取动态分配内存的地址?
由new
运算符返回,它分配内存并构造对象。由于仅在一个语句中使用动态内存没有用,因此必须将地址存储在变量中。
什么类型的变量可以存储对象的内存地址?
指针类型。 new-expression的返回值的类型是指向您构造的对象类型的指针。
一个例子:
void foo() {
Foo f; // The object of type Foo has automatic storage and can be accessed through the variable `f`.
Foo* f_ptr; // The pointer object has automatic storage and is not yet initialized.
new Foo; // Bad! The dynamically allocated memory can not be accessed in any way (it has leaked).
f_ptr = new Foo; // The address of another dynamically allocated object is assigned to the f_ptr variable. The object is accessible through this pointer.
delete f_ptr; // Dynamically allocated objects must be deleted explicitly.
// f and f_ptr are destroyed automatically when the scope ends. If the memory pointed by f_ptr was not deleted before this, the memory would leak.
}
答案 2 :(得分:0)
问题本身有点荒谬。关键字new
用于在堆上分配内存,并返回指向已分配对象的指针,或者在分配失败时抛出std::bad_alloc
。从某种意义上说,问问为什么int main(int argc, char** argv)
返回一个int。
在C ++中,您有两个可以使用的地址空间;堆栈和堆。
通常,您希望使用堆来分配对象,并通过引用,首选方式或指针将它们传递给函数。在某些情况下,您无法使用堆栈,主要是当您不知道要创建的对象将存活多久或者您知道该对象的寿命应该超过创建它的范围时。对于这些情况,如果您使用的是C ++ 11,则应该使用std::unique_ptr
或std::shared_ptr
,因为当不再需要该对象时,该对象将被自动删除。
通常不鼓励使用关键字new
,只有当您确定上述两种方法均无效时才能使用。
阅读新的操作员:
shared_ptr:
堆栈和堆之间的区别:
答案 3 :(得分:0)
您使用的函数(例如:c中的malloc()
)尝试使用您询问的长度获取内存的一部分,然后如果分配成功,它会为您提供此部分内存的地址否则它会给你一个0(至少在c和c ++中)。
(如果你想为n个项目的数组提供内存,你必须要求n *项目大小,你将获得数组的地址,实际上也是数组第一个元素的地址。)
示例:我想要一个包含10个整数的数组
// ask for allocation and get the address of the memory
int * my_array = (int *)malloc(10*sizeof(int));
// you must verify that the allocation was successful
if(my_array != 0) {
// the system gave you the memory you need
// you can do your operations
// " * my_array " and " my_array[0] " have the same meaning
my_array[0] = 22;
* my_array = 22;
// This two lines make the same thing : the put 22 in the memory at the adresse my_array
// same thing for " *(my_array + 9*sizeof(int)) " and " my_array[9] "
my_array[9] = 50;
*(my_array + 9*sizeof(int)) = 50;
// This two lines make the same thing : the put 50 in the memory at the adresse my_array + 36
// 36 = 9*4 (sizeof(int) = 4 in most cases)
free(my_array); //always free the memory to give back the memory to the system and do not "lost it"
}
在c ++中它是相同的,但您将malloc
替换为new
而将free
替换为delete
。它们是关键字,但您可以将它们视为功能,以了解它的作用。