C++ realloc返回的内存中充满了随机字符。这是预期的吗?

C++ realloc返回的内存中充满了随机字符。这是预期的吗?,c++,memory-management,dynamic,dynamic-memory-allocation,C++,Memory Management,Dynamic,Dynamic Memory Allocation,我正在使用realloc扩展我为动态分配的数组声明的初始内存。我不知道输入的尺寸,所以我逐字符读取它,当我检测到超出最初分配的内存时,我调用realloc。代码如下: void readLine(char *line, int &len) { int newSize = expand; char ch; while(f >> noskipws >> ch) { if (ch == '\n') brea

我正在使用realloc扩展我为动态分配的数组声明的初始内存。我不知道输入的尺寸,所以我逐字符读取它,当我检测到超出最初分配的内存时,我调用realloc。代码如下:

void readLine(char *line, int &len) {
    int newSize = expand;
    char ch;
    while(f >> noskipws >> ch) {
        if (ch == '\n')
            break;
        if (++len >= newSize - 1) {
            newSize += expand;
            line = (char*)realloc(line, newSize);
        }
        line[len] = ch;
    }
}
我的问题是,在程序reallocs‘line’之后,它用各种ASCII字符填充它。这是正常的行为吗

在程序
realloc
s
line
之后,它用各种ASCII字符填充程序

realloc
不会用任何东西填充返回的内存。这个随机垃圾是以前使用内存的东西留下的。您的代码不应该在没有写入内容的情况下读取任何分配的字节

您可能会看到此随机数据的原因是,
未终止。添加
行[++len]='\0'在循环后修复此问题

代码中更大的问题是,
line
是一个按值传递给函数的指针。这意味着您所做的任何重新分配都不会传播到调用方。此外,如果调用者向您传递了有效内存,并且您对其调用了
realloc
,则调用者中的指针将在成功调用
realloc
时失效

要解决此问题,请将
作为指针的参考:

void readLine(char*& line, int &len) {
    ...
}

<强>注:我假设您在使用<代码> ReLoCu中进行练习,因为C++标准库具有内置函数,用于读取<代码> STD::String < /Cord>s的任意大小。


另一个要点是,您不应立即将
realloc
分配给
line
。相反,您应该将其分配给一个临时变量,检查
NULL
,并且仅当它通过检查时才分配给
line
。当系统内存不足时,这将使您避免内存泄漏。

uHM,但您正在使用C++!你们认为右班操作员在C中会做什么?你认为noskipws在C中会做什么?通过引用传递参数在C中如何工作?那个代码绝对是C++。删除C++标签不会使代码减少C++。关于@ MartinJames的“代码> > RealCalc/Cuff>问题,建议您检查由代码< ReAlLC返回的指针,并将它与您传递给 RealLC/<代码>的指针进行比较(在调试器中或打印指针)。我几乎可以肯定,每次调用
realloc
时,它都会有所不同。虽然允许
realloc()
扩展传递给它的块,但这取决于是否有可用的空间,这是不常见的。通常,它分配一个新的较大的块,从旧块复制数据,并释放旧块,使原始指针无效。这是C++。它在C中是无效的代码。
而(f>>noskipws>>ch)
在C中没有什么意义。编译的Post代码。你能解释一下该函数是如何工作的吗?realloc可以修改行,但只能修改本地副本。。。当然,这会给调用者留下一个无用的“行”指针吗?@JohnBollinger-Martin的评论出现在编辑之前。@MartinJames你是对的,我直接查看了
realloc
调用,完全忽略了OP将
line
传递到其函数中的方式。非常感谢。没问题,我只是想确定我做对了:)