c++ - 使用常量长度时 char[] 和 new char[] 之间的区别

标签 c++ memory initialization arrays dynamic-allocation

所以这似乎是一个得到广泛回答的问题,但我更感兴趣的是两者之间到底发生了什么不同的内部结构。

除了第二个示例不仅创建了内存,还创建了指向内存的指针这一事实,当发生以下情况时内存会发生什么:

char a[5];
char b* = new char[5];

为什么我问这个问题更直接相关,我怎么能做

const int len = 5;
char* c = new char[len];

但不是

const int len = 5;
char d[len]; // Compiler error

EDIT 应该提到我在 VC++ 上遇到了这个编译器错误(去计算...)

1>.\input.cpp(138) : error C2057: expected constant expression
1>.\input.cpp(138) : error C2466: cannot allocate an array of constant size 0
1>.\input.cpp(138) : error C2133: 'd' : unknown size

编辑 2:应该发布我正在使用的确切代码。当使用运行时值计算动态分配数组的常量长度时会产生此错误。

假设 random(a,b) 返回 ab 之间的 int

const int len1 = random(1,5);
char a[len1]; // Errors, since the value
              // is not known at compile time (thanks to answers)

鉴于

const int len2 = 5;
char b[len2]; // Compiles just fine

最佳答案

区别在于数组的生命周期。如果你写:

char a[5];

那么这个数组有它定义的 block 的生命周期(如果它是 在 block 范围内定义),包含它的类对象(如果它是 在类作用域中定义)或静态生命周期(如果它在命名空间中定义 范围)。如果你写:

char* b = new char[5];

,那么这个数组有你想给它的任何生命周期——你必须 显式终止其生命周期:

delete [] b;

关于您的最后一个问题:

int const len = 5;
char d[len];

是完全合法的,应该编译。不同之处:

int len = 5;    //  _not_ const
char d[len];    //  illegal
char* e = new char[len];    //  legal

造成差异的原因主要是编译器技术和 历史:在很早的时候,编译器必须知道 为了将数组创建为局部变量。

关于c++ - 使用常量长度时 char[] 和 new char[] 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226680/

相关文章:

c++ - 为什么不需要通过内联函数进行静态初始化

c++ - 异常能否自动提供有关其环境的详细信息?

c++ - XCode 中的调试 View 中出现奇怪的值

javascript - Chrome 陷入无限循环,无法复制/粘贴以保存我的 jsfiddle

c - 简单链表实现 C 中的奇怪内存问题

memory - 这是 Spark 流的错误还是内存泄漏?

javascript - 你能初始化一个函数吗? - Javascript

c++ - 动态内存控制的优点是什么?

c++ - C/C++ 中的 Unicode 字符串规范化

c++ - 可选未初始化的类: std::is_trivially_constructible 对于非默认构造函数似乎不正确?