Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++ 使用char*的内存泄漏?_C++_File_Allocation - Fatal编程技术网

C++ 使用char*的内存泄漏?

C++ 使用char*的内存泄漏?,c++,file,allocation,C++,File,Allocation,我阅读了一个文本文件,其内容类似于“sasdfsdf”,代码如下: char* o = new char[size]; c = 0; for (i = 0; i < n; i++) { fseek(pFile, i, SEEK_SET); b = fgetc(pFile); if (b == '\r') { o[c] = b; c++; o[c] = '\n'; } else { o[c

我阅读了一个文本文件,其内容类似于“sasdfsdf”,代码如下:

char* o = new char[size];
c = 0;
for (i = 0; i < n; i++)
{
    fseek(pFile, i, SEEK_SET);
    b = fgetc(pFile);
    if (b == '\r') {
        o[c] = b;
        c++;
        o[c] = '\n';
    }
    else {
        o[c] = b;
    }
    c++;
}
fclose(pFile);

SetWindowTextA(TextBox1.hWnd, (n > 0) ? o : NULL);

delete[] o;
char*o=新字符[大小];
c=0;
对于(i=0;i0)?o:NULL;
删除[]o;
首先我想知道这个代码是否干净。我想这不是因为我是C/Cpp新手,有时在理解分配方面有一些问题。
我想使用C样式(FILE*、fopen、fseek、fget等)来获取文件的内容。问题是char*o总是添加了一些内容。我有一个例子:它将“sasdfsdf¨∠»3”写入编辑控件,而不是“sasdfsdf”(文本文件内容)。我发现,当for循环作用域保留时,添加了“°3”。我想这有点像内存泄漏。我不知道这个字符应该从哪里来。

您必须通过添加终止空字符来终止字符串
“\0”

                    char* o = new char[size];
                    c = 0;
                    for (i = 0; i < n; i++)
                    {
                        fseek(pFile, i, SEEK_SET);
                        b = fgetc(pFile);
                        if (b == '\r') {
                            o[c] = b;
                            c++;
                            o[c] = '\n';
                        }
                        else {
                            o[c] = b;
                        }
                        c++;
                    }
                    o[c] = '\0'; // add this to terminate the string
                    fclose(pFile);

                    SetWindowTextA(TextBox1.hWnd, (n > 0) ? o : NULL);

                    delete[] o;
char*o=新字符[大小];
c=0;
对于(i=0;i0)?o:NULL;
删除[]o;

您必须通过添加终止空字符
“\0”来终止字符串。

                    char* o = new char[size];
                    c = 0;
                    for (i = 0; i < n; i++)
                    {
                        fseek(pFile, i, SEEK_SET);
                        b = fgetc(pFile);
                        if (b == '\r') {
                            o[c] = b;
                            c++;
                            o[c] = '\n';
                        }
                        else {
                            o[c] = b;
                        }
                        c++;
                    }
                    o[c] = '\0'; // add this to terminate the string
                    fclose(pFile);

                    SetWindowTextA(TextBox1.hWnd, (n > 0) ? o : NULL);

                    delete[] o;
char*o=新字符[大小];
c=0;
对于(i=0;i0)?o:NULL;
删除[]o;

如注释所示,您在C中编写,但已标记了问题C++。这里,C++提供了一种更短的解决方案,不需要对您的部分(甚至是C样式代码)进行任何动态分配,只需要使用<代码> COSTEXPRESSIEXT Nele=大小;CHOR[NeleM] =“;将创建所需长度的简单数组”。 上面缺少的部分是,
fgetc()
每次从文件流中读取一个字符时都会推进flle位置,因此不需要
fseek(pFile,i,SEEK\u SET)这完全是多余的

在C++中,你最好从<代码> fStase中读取,而不是使用C<代码>文件*<代码>。使用
std::string
比使用
char*
要好得多,因为
std::string
消除了在数组末尾以外写入的可能性(在循环中无法检查)。使用
getline()
从文件中读取一行后,只需使用
std::replace()
将所有
'\r'
替换为
'\n'
。完成后,所有内存将自动释放

您可以编写类似以下内容的例程:

#include <fstream>
#include <string>
#include <algorigthm>

void somefunc (std::fstream& stream)
{
    std::string line{}, windowtext{};
    
    while (getline (stream, line)) {
        std::replace (line.begin(), line.end(), '\r', '\n');
        windowtext += line;
    }
    
    SetWindowTextA (TextBox1.hWnd, windowtext.length() > 0 ? windowtext : nullptr);
    
    /* close file back in caller */
}
#包括
#包括
#包括
void somefunc(std::fstream&stream)
{
std::字符串行{},windowtext{};
while(getline(流,行)){
std::replace(line.begin()、line.end()、'\r'、'\n');
windowtext+=行;
}
SetWindowTextA(TextBox1.hWnd,windowtext.length()>0?windowtext:nullptr);
/*在调用者中关闭文件*/
}
<>(注释:在C++中,当文件流对象超出范围时,打开的文件流将被关闭,因此您不需要手动关闭流)

另请注意@RemyLebeau在评论中指出,在windows上,
getline()
将删除构成DOS行结尾的CR和LF。如果需要使用手册
'\n'
创建换行符,则需要
windowtext+=line+'\n'
而不是
std::replace
,以插入
'\n'


检查问题,如果有问题,请告诉我。

< P>如注释所示,你在C中书写,但已经标记了你的问题C++。这里,C++提供了一种更短的解决方案,不需要对您的部分(甚至是C样式代码)进行任何动态分配,只需要使用<代码> COSTEXPRESSIEXT Nele=大小;CHOR[NeleM] =“;将创建所需长度的简单数组”。 上面缺少的部分是,
fgetc()
每次从文件流中读取一个字符时都会推进flle位置,因此不需要
fseek(pFile,i,SEEK\u SET)这完全是多余的

在C++中,你最好从<代码> fStase中读取,而不是使用C<代码>文件*<代码>。使用
std::string
比使用
char*
要好得多,因为
std::string
消除了在数组末尾以外写入的可能性(在循环中无法检查)。使用
getline()
从文件中读取一行后,只需使用