假设我有两组代码,
std::vector<float>v1;
和
std::vector<float> *pV2 = new std::vector<float>(10);
除了使用指向向量的指针分配更大的内存块之外,还有什么区别?一个对另一个有优势吗?
在我看来,似乎分配指针只是一个麻烦,因为你必须处理以后解除分配。
答案 0 :(得分:1)
除了使用指向vector的指针分配更大的内存块之外,还有什么区别呢?
答案 1 :(得分:0)
其中一个关键区别是范围。在第一个示例中,向量可能是类的成员,也可能是函数的本地成员。如果它是类成员,则在销毁包含对象时将销毁它。如果它是函数的本地函数,它将在函数结束时被销毁。该对象绝对不能存在,所以如果你尝试将其地址传递给程序的另一部分,你必须非常小心。
当您在堆上手动分配某些内容时,它将根据您的需要存在。您可以完全控制释放,这意味着您可以在一个对象/函数中创建它,并在需要时在另一个对象/函数中使用或删除它。
在各种情况下,能够延迟对象的实例化直到实际需要它才是非常有用的。例如,根据用户输入,它可能需要不同的构造参数,或者您可能希望利用多态性(即在运行时决定实例化哪个子类)。
某些情况的另一个关键区别是可用内存。如果在本地为函数创建对象,它将驻留在堆栈上。堆栈上的可用空间比堆上的空间少得多,因此在使用特别大的对象时可能会遇到困难(尽管对于向量不会发生这种情况,因为它无论如何都会在内部分配)。
值得注意的是,对象使用的实际内存量是相同的,无论是在堆栈上还是在堆上。唯一的区别是,如果你在堆上手动分配一些东西,那么你也会有一个指向它的指针。这只是额外的4或8个字节,在大多数情况下可以忽略不计。