Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 新内存分配太多_C++_C_Char_New Operator - Fatal编程技术网

C++ 新内存分配太多

C++ 新内存分配太多,c++,c,char,new-operator,C++,C,Char,New Operator,我正在编写合并两个C字符串的简单函数。在尝试动态分配新内存块时,我发现: char * out = new char[size]; std::cout << strlen(out) <<std::endl; 大小为4时返回16,大小为22时返回40,依此类推。 有人知道为什么会这样,以及如何为具有特定字符数的c字符串分配内存吗?使用new分配内存不会初始化内存: char * out = new char[size]; // Add this code to init

我正在编写合并两个C字符串的简单函数。在尝试动态分配新内存块时,我发现:

char * out = new char[size];
std::cout << strlen(out) <<std::endl;
大小为4时返回16,大小为22时返回40,依此类推。 有人知道为什么会这样,以及如何为具有特定字符数的c字符串分配内存吗?

使用new分配内存不会初始化内存:

char * out = new char[size];

// Add this code to initialize out
memset(out,'A',size-1);
out[size-1]='\0';

std::cout << strlen(out) <<std::endl;
使用new分配内存不会初始化内存:

char * out = new char[size];

// Add this code to initialize out
memset(out,'A',size-1);
out[size-1]='\0';

std::cout << strlen(out) <<std::endl;

分配的内存未初始化。strlen只是在内存中不断充电,直到遇到空字符“\0”。由于您尚未初始化out指向的内存,因此该内存的内容未定义,因此strlen的行为也未定义

strlen不测量分配的大小,因此您对new分配太多内存的解释是不正确的,因为您用于测量分配大小的工具根本不这样做


在你的情况下,斯特伦的读数超出了分配范围。在这种情况下,结果可能是您在此处看到的错误值,或者您的程序可能只是崩溃。

分配的内存未初始化。strlen只是在内存中不断充电,直到遇到空字符“\0”。由于您尚未初始化out指向的内存,因此该内存的内容未定义,因此strlen的行为也未定义

strlen不测量分配的大小,因此您对new分配太多内存的解释是不正确的,因为您用于测量分配大小的工具根本不这样做



在你的情况下,斯特伦的读数超出了分配范围。在这种情况下,结果可能是您在此处看到的错误值,或者您的程序可能会崩溃。

您没有初始化字符串。strlen需要一个以0结尾的缓冲区。问了这么多次……是的——只要我在一个问题中看到斯特伦……就不清楚这是提议的原件的副本。这个问题涉及将strlen应用于已初始化但不包含终止空字符的数组。此问题将strlen应用于未初始化的数组。从这个问题上看,我们不清楚混乱是关于strlen如何操作,还是关于new是否以及如何初始化以这种方式分配的数组。@H2CO3-就像我在整个空闲时间读到的一样,我知道这一点。问题是分配有问题,但缺少字符串终止符。这只是一件简单的事情,你会忘记,因为你已经很久没有使用它了。这总是让我感到惊讶——当被问到一个简单的问题时,SoftDev的家伙们怎么能得到这么大的麻烦。很好的建议——如果它对你的灵魂伤害太大,而你想表达它的伤害程度,而不是给出真正的答案——那就不要这样做。@Eric对了,你有更好的欺骗吗?我很有信心这是一个重复的字符串。您不需要初始化字符串。strlen需要一个以0结尾的缓冲区。问了这么多次……是的——只要我在一个问题中看到斯特伦……就不清楚这是提议的原件的副本。这个问题涉及将strlen应用于已初始化但不包含终止空字符的数组。此问题将strlen应用于未初始化的数组。从这个问题上看,我们不清楚混乱是关于strlen如何操作,还是关于new是否以及如何初始化以这种方式分配的数组。@H2CO3-就像我在整个空闲时间读到的一样,我知道这一点。问题是分配有问题,但缺少字符串终止符。这只是一件简单的事情,你会忘记,因为你已经很久没有使用它了。这总是让我感到惊讶——当被问到一个简单的问题时,SoftDev的家伙们怎么能得到这么大的麻烦。很好的建议——如果它对你的灵魂伤害太大,而你想表达它的伤害程度,而不是给出真正的答案——那就不要这样做。@Eric对了,你有更好的欺骗吗?我很有信心这是重复的。从技术上讲,new char[size]仍在使用new and。这只是代码片段。在这之后,我有一个for循环,它将等于变量“size”的确切数字放入“out”char*。例如,我没有使用“aabb”字符串,而是使用了“aabbrrzzzzzz”@pawels1991,它们中是否有一个是空终止符?@pawels1991,至少是最后一个?使用null表示0可以使用编译器编译,但从语义上使用它绝对是错误的。NULL表示一个NULL指针,而不是NUL终止符。从技术上讲,new char[size]仍在使用new and。它只是一段代码。在这之后,我有一个for循环,它将等于变量“size”的确切数字放入“out”char*。例如,pawels1991没有使用“aabb”字符串,而是使用了“aabbrrzzzzzz”,它们中是否有一个是空终止符?@Pawell
s1991,至少,最后一个?对0使用NULL可以使用编译器编译,但从语义上使用它绝对是错误的。NULL表示NULL指针,而不是NUL终止符。new初始化它创建的某些对象而不是其他对象,因此解释此分配不初始化已分配内存的原因可能很有用。new初始化它创建的某些对象而不是其他对象,因此,解释为什么此分配不会初始化已分配的内存可能很有用。