C++ 动态数组大小定义

6

我习惯于使用Java和PHP,现在需要编写一些C++代码。我遇到了创建动态大小的BYTE数组的困难。如何实现呢?

int byteSize = shm.getMemorySize();
BYTE byte[44]; // replace 44 by byteSize

1
GCC支持编写BYTE byte[byteSize]; - πάντα ῥεῖ
这取决于BYTE是什么? - Lightness Races in Orbit
6个回答

9

除非您有非常特殊的原因要使用数组,否则应该使用std::vector。通常,在与其他语言中使用数组的类似上下文中,在C++中默认选择应该是std::vector


最后一个假设仅适用于动态数组,而不是固定大小的数组。对于固定大小的数组,他可以使用std :: array。 - PaulD
1
他可以这样做,但通常不值得花费这些精力,特别是如果你是新手的话。 - Puppy
大小呢?也许你应该提到resize() - πάντα ῥεῖ
他可以查找如何使用它。 - Lightness Races in Orbit

6

永远不要使用裸指针,否则会给漏洞和内存泄漏留下后门。相反,以下是一些替代方案:

int len = something;
std::vector<char> buffer(len,0);

或者C++11智能指针。
std::unique_ptr<char[]> buffer{ new char[len] };

或者使用带有make_unique的c++14。
auto buffen = std::make_unique<char[]>(len);

3

如果您不是必须自己处理内存,建议使用向量。此外,这更多是个人偏好的问题,但我更喜欢使用uint8_t而不是BYTE。它更加符合标准,因为它不依赖于GCC。

#include <vector>
#include <cstdint>
...
std::vector<uint8_t> foo;

或者

#include <cstdint>
...
uint8_t* data;
data = new uint8_t[10];
...
delete[] data;

3
您可以使用STL标准容器类std::vector来创建一个动态可调整大小的数组:
#include <vector> // For std::vector
....

int byteSize = shm.getMemorySize();

// Create a vector of 'byteSize' bytes.
std::vector<BYTE> bytes(byteSize);

您可以使用通常的[]语法(例如bytes [0]bytes [1],... bytes [i])来访问向量元素。 vector的析构函数将自动释放向量分配的内存,因此您无需关注释放内存。
您可以使用vector的push_back()方法在向量末尾添加项目(带有自动调整大小)。 您可以使用vector的clear()方法清空它。并且vector的size()方法返回向量中当前项目的数量。
如果您想了解更多关于std::vector的信息,您可以观看Stephan T. Lavavej的这个精彩的介绍性视频

2
一种方法是使用动态内存分配和 new
BYTE* data = new BYTE[byteSize];
data[0] = 0;
delete [] data;

然而,对于初学者来说,这种方法可能会导致内存损坏、崩溃、内存泄漏以及各种难以发现和修复的问题。

更好的方法是使用std::vector,它几乎可以避免第一种方法所遇到的问题:

std::vector<BYTE> data;
data.resize(byteSize);
data[0] = 0;

1
您可以按以下方式创建动态数组:

int byteSize = shm.getMemorySize();
BYTE* byte = new BYTE[byteSize];
//Use the byte
delete [] byte;

3
没有上下文,没有人能够正确地说这是错误的解决方案。但它只剩下了一个很小的市场。 - Deduplicator
1
没有上下文的情况下,你肯定不应该将其断言为正确的解决方案。这是更重要的看待问题的方式。 - Lightness Races in Orbit
1
@tmp:术语“动态数组”意味着数组可以调整大小,删除元素等。那么如何推荐new[]和delete[]来实现这一点呢?它无法做到这一点 - 您必须编写各种代码来完成动态数组应该能够完成的基本操作。因此,真正的答案是使用诸如std :: vector之类的容器,它具有操作动态数组所需的所有工具。 - PaulMcKenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接