我来自java背景,我可以用Java做一些我需要用C ++做的事情,但我不知道该怎么做。
我需要声明一个数组,但此刻我不知道它的大小。一旦我知道了大小,我就设置了数组的大小。我java我会做的事情如下:
int [] array;
然后
array = new int[someSize];
如何在C ++中执行此操作?
答案 0 :(得分:27)
您希望在大多数情况下使用std::vector
。
std::vector<int> array;
array.resize(someSize);
但是如果你坚持使用new
,那么你所做的工作要比在Java中做得多。
int *array;
array = new int[someSize];
// then, later when you're done with array
delete [] array;
默认情况下,没有c ++运行时自带垃圾回收,因此需要delete[]
以避免内存泄漏。您可以使用智能指针类型充分利用这两个世界,但实际上,只需使用std::vector
。
答案 1 :(得分:15)
在C ++中你可以这样做:
int *array; // declare a pointer of type int.
array = new int[someSize]; // dynamically allocate memory using new
一旦你完成了使用memory..de-使用delete as:
分配它delete[]array;
答案 2 :(得分:1)
最佳方式是使用std::vector
。它可以满足您的所有需求,并且易于使用和学习。此外,由于这是C ++,您应该使用vector
而不是数组。 Here是一个很好的理由,为什么你应该使用容器类(向量)而不是数组。
矢量的大小是动态的,并随着你的需要而增长 - 正如你想要的那样。
答案 3 :(得分:1)
确切答案:
char * array = new char[64]; // 64-byte array
// New array
delete[] array;
array = new char[64];
但是,在大多数情况下, std::vector
是更好的选择。如果没有手动删除和新命令,它可以满足您的需求。
答案 4 :(得分:1)
正如其他人所说,std::vector
通常是要走的路。原因是向量很好理解,它在编译器和平台之间标准化,最重要的是它使程序员免于手动管理内存的困难。此外,需要顺序地分配矢量元素(即,矢量元素A,B,C将以与它们被推入矢量相同的顺序出现在连续存储器中)。这应该使向量与常规动态分配的数组一样对缓存友好。
虽然可以通过声明指向int并手动管理内存来完成相同的最终结果,但这意味着额外的工作:
与std::vector
不同,此方法不是RAII - 友好。请考虑以下示例:
void function()
{
int* array = new int[32];
char* somethingElse = new char[10];
// Do something useful.... No returns here, just one code path.
delete[] array;
delete[] somethingElse;
}
它看起来安然无恙。但事实并非如此。如果在尝试为“somethingElse”分配10个字节时系统内存不足,该怎么办?将抛出类型std::bad_alloc
的异常,它将开始展开堆栈以查找异常处理程序,在函数末尾跳过删除语句。你有内存泄漏。这只是避免在C ++中手动管理内存的众多原因之一。为了解决这个问题(如果你真的真的想要),Boost库提供了一堆不错的RAII包装器,例如scoped_array和scoped_ptr。
答案 5 :(得分:0)
在编译时知道size时使用std :: array,否则使用std :: vector
#include <array>
constexpr int someSize = 10;
std::array<int, someSize> array;
或
#include <vector>
std::vector<int> array; //size = 0
array.resize(someSize); //size = someSize
答案 6 :(得分:-1)
声明一个指针:
int * array;