定义数组,然后更改其大小

时间:2010-10-03 19:07:06

标签: c++ arrays

我来自java背景,我可以用Java做一些我需要用C ++做的事情,但我不知道该怎么做。

我需要声明一个数组,但此刻我不知道它的大小。一旦我知道了大小,我就设置了数组的大小。我java我会做的事情如下:

int [] array;

然后

array = new int[someSize];

如何在C ++中执行此操作?

7 个答案:

答案 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并手动管理内存来完成相同的最终结果,但这意味着额外的工作:

  1. 每次需要更多内存时,必须手动分配
  2. 在为指针分配新值之前,必须非常小心地删除以前分配的任何内存,以免你遇到大量内存泄漏。
  3. 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;
    }
    
  4. 它看起来安然无恙。但事实并非如此。如果在尝试为“somethingElse”分配10个字节时系统内存不足,该怎么办?将抛出类型std::bad_alloc的异常,它将开始展开堆栈以查找异常处理程序,在函数末尾跳过删除语句。你有内存泄漏。这只是避免在C ++中手动管理内存的众多原因之一。为了解决这个问题(如果你真的真的想要),Boost库提供了一堆不错的RAII包装器,例如scoped_arrayscoped_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;