C++ 使用char*的内存泄漏?
我阅读了一个文本文件,其内容类似于“sasdfsdf”,代码如下: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
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()
从文件中读取一行后,只需使用