在通过new
(在C ++中)分配缓冲区时,我错误地写道:
int size = 1024 * 1024;
char *buf = new char(size);
而不是正常的语法
char *buf = new char[size];
然而,在使用此buf
变量时,代码确实被编译并导致奇怪的崩溃。显然,似乎分配了一个8字节的缓冲区。
我想知道new char(size)
的含义。
答案 0 :(得分:7)
char *buf = new char(size);
它仅分配sizeof(char)
字节,并使用size
- 松散对其进行初始化:
char *__internal_buf = new char; //1 byte only
*__internal_buf = size; //or static_cast<char>(size);
char *buf = __internal_buf;
与这两者的区别相同:
char x(65); //y is single element initialized to be 'A'. as 65 is 'A'
char y[65]; //y is an array of size 65
希望有所帮助。
答案 1 :(得分:4)
这意味着您为单个char
分配内存并使用整数size
对其进行初始化。在您的情况下,size
不适合char
。如果恰好对char
进行了签名,则整数size
将转换为char
,但结果是实现定义的。如果char
为unsigned
,则int
会回绕char
所代表的最大值(通常为255)。
非指针也存在类似的语法:
int x(10); // initialize x with 10
或
char c('a'); // initializes c with 'a'
答案 2 :(得分:1)
空,但这是一个更好的例子:
#include <iostream>
using namespace std;
int main() {
int size = 'A';
char *buf = new char(size);
cout << *buf;
}
打印出A
NULL的原因:1024 * 1024 = 0x100000。最后一个字节在char中。 Char是空的。事实上,我在一段时间内看到了最低效的空终止字符串。