- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道有几篇关于此错误的帖子,但它们都是针对特定情况的。我正在制作一个文件拆分/连接器,它具有以下要求:-用户必须输入文件名/输入路径和输出文件夹。我用将原始文件拆分为 N 部分(用户必须输入)的基本部分编写了拆分函数,一切都很好。然后我对该函数进行了一些修改以满足“输出文件夹”的要求,然后当我运行该程序时,出现了该错误(尽管已成功构建)。有人可以解释/澄清我在代码中做错了什么吗?我仍然是处理文件/内存泄漏的初学者,因此感谢所有帮助/批评。
char *GetFileName(char *path)
{
char *filename = strrchr(path, '\\');
if (filename == NULL)
filename = path;
else
filename++;
return filename;
}
void split_F(const char* file_name, const char* output_folder, int number_of_part)
{
FILE *fp_read = fopen(file_name, "rb");
//calculate file size
int file_size;
fseek(fp_read, 0L, SEEK_END);
file_size = ftell(fp_read);
rewind(fp_read); //reset file pointer
//calculate number of parts
long size_of_part;
size_of_part = (int)ceil((double)file_size / number_of_part);
cout << "Total files after split: " << number_of_part << endl
<< "...Processing..." << endl;
//extract file name
char *first_part = new char[255];
char *temp = new char[255];
strcpy(temp, file_name);
first_part = GetFileName(temp);
cout << endl << "File name is: " << first_part;
//main process
char* name = new char[255];
strcpy(name, output_folder);
int bytesRemaining = file_size;
//create buffer
char *buffer = new char[size_of_part];
for (int count = 1; count <= number_of_part; count++)
{
sprintf(name, "%s.part_%03d", first_part, count); //attach file name to output directory
FILE *fp_write = fopen(name, "wb");
long partSize;
if (bytesRemaining > size_of_part)
{
partSize = size_of_part;
}
else
{
partSize = bytesRemaining;
}
fread(buffer, partSize, 1, fp_read);
fwrite(buffer, partSize, 1, fp_write);
cout << "> File: " << name << " done babe!" << endl;
fclose(fp_write);
}
fclose(fp_read);
delete[] buffer;
delete[] name;
delete[] temp;
delete[] first_part;
}
最佳答案
首先,您的代码有很多问题,都是因为使用了 C 风格编码而不是使用 C++。相反,如果您使用 std::string
和 C++ 流,很多这些问题都会自行解决。
第一个问题是您从未检查文件是否存在:
FILE *fp_read = fopen(file_name, "rb");
如果 fp_read
为 NULL,您就不会检查它,并且您的代码会继续运行,就好像没有任何错误一样。这是不正确的。
然后在您的代码中执行此操作:
FILE *fp_write = fopen(name, "wb");
同样,当 fp_write
可能为 NULL 时,您没有检查它是否正常。
但让我们假设 fp_read
和 fp_write
不为 NULL
//extract file name
char *first_part = new char[255];
char *temp = new char[255];
strcpy(temp, file_name);
上述有 2 个潜在问题。
第一个问题是您没有检查以确保 file_name
少于 255 个字符。如果 file_name
比预期的大,则在调用 strcpy
时会覆盖内存。使用 strncpy
或 memcpy
声明要复制的数字字符。
第二个问题比较微妙,就是你调用了两次new[]
。如果第二次调用 new[]
抛出异常怎么办?您将如何释放对 new[]
的第一次调用?你不能。此外,由于抛出异常,您的输入文件仍将打开。
这就是为什么在这些情况下应该使用 std::string
和 ifstream
ofstream
的原因。如果函数出于任何原因返回,这些类型会自动释放分配的任何资源。使用 C
风格的字符串和 I/O 会使您容易受到泄漏的影响。
同样的问题:
//main process
char* name = new char[255];
strcpy(name, output_folder);
int bytesRemaining = file_size;
//create buffer
char *buffer = new char[size_of_part];
所有这些对 new[]
的调用都可能抛出
,从而离开此函数,并导致内存泄漏和打开的文件句柄。
另一个问题是您需要确保您的 buffer
不会溢出。这段代码:
long partSize;
if (bytesRemaining > size_of_part)
{
partSize = size_of_part;
}
else
{
partSize = bytesRemaining;
}
可以缩短为:
partSize = std::min(bytesRemaining, size_of_part);
这清楚地表明了您的意图。
另一个问题是您的 bytesRemaining
在您编写输出的循环中永远不会更新。你应该有
bytesRemaining -= partSize;
在循环中。
关于c++ - _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) C++ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29713023/
在 C++ 中的以下代码: class Foo { vector otherFoos; }; int _tmain(int argc, _TCHAR* argv[]) { Foo* dat
我有一个代码,我需要在其中分配一个指向指针数组的指针,但是当我想安全地删除它时,调试器给我错误。 我知道我不应该使用指针的指针数组,而应该使用 vector 类,但我不得不这样做。我有两个类(clas
我正在尝试释放动态内存,但出现错误。我需要一些帮助来指出我的代码的哪一部分导致了错误。 我有析构函数来释放两个动态数组。删除析构函数我没有错误。 错误:_BLOCK_TYPE_IS_VALID(pHE
免责声明:这是一项家庭作业。我们必须创建一个使用类对象来保存数字的计算器。我们有一个名为 Element 的类,它进入数据库并包含一个名为 Container 的类,该类存储数字数据。 我在这段代码中
当我在 Debug模式下构建可视化 C++ 项目时,只需两行代码 TEnviron * fk = new TEnviron(); delete fk; 它从 _CrtIsValidHeapPointe
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我在这里查看了类似的问题,但仍然无法意识到我做错了什么。请帮忙。 我需要为大小有限的字符串类制作模板(就像在 Pascal 中一样)代码如下:http://pastebin.com/syZf3yM8
首先,我将向您展示我的代码。 std::ifstream file("accounts/22816.txt"); if(file){ char *str[50]; int count=0;
我有一个错误“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”,我不知道该怎么办.. person.h #ifndef _person_H #define _person
这个问题在这里已经有了答案: What is The Rule of Three? (8 个答案) 关闭 8 年前。 我知道这是一个常见错误,所以我尝试创建一个最小示例。我认为这是因为我试图释放堆栈
我在下面代码的最后一行遇到错误“_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”: pixelCoorindateAndThreePoint* tempSpace = n
这个问题在这里已经有了答案: What is the behavior of "delete" with stack objects? [duplicate] (1 个回答) 关闭 6 年前。 我是
class A { public: void doSomething() {} } boost::unordered_map> m; m.insert(0, new A()); m.inser
我正在尝试修复一个非常严重的内存泄漏,但不知何故我无法在不触发此断言的情况下删除对象。 我已通过 Google 搜索了解决方案,并已阅读有关此错误的 Stackoverflow 上的问题,但我仍然无法
我一直在从事一个新项目,但遇到了一个我不知道为什么会失败的问题。 当我执行此行删除 textY 时,给我错误 _Block_Type_Is_Valid (pHead->nBlockUse)。那我做错了
我想弄清楚为什么我的程序在运行时会失败。到目前为止,当我运行我的程序时,它对我失败了。我调试了错误,它把我带到了 dbgdel.cpp。第 32 行“_ASSERTE(_BLOCK_TYPE_IS_V
我正在编写一个类似于电影信息系统的程序。我是 C++ 的初学者。 每次编译后我都会收到此错误警报消息。我确信在 detructor 调用时它会出错。 我阅读了很多与此错误相关的帖子。但我还是忍不住。我
我不知道为什么我总是收到 _Block_Type_Is_Valid (pHead->nBlockUse) 错误。我知道这通常是因为我双重删除了一些东西但我只在代码中使用了一次删除。以下是代码。 Box
我已经在这段代码上工作了一段时间,试图用测试床 main 测试我的 Company 类。我得到了我想要的所有结果,但是在完成主要功能后程序崩溃了 this message:(我很抱歉,但我是新来的,我
我知道有几篇关于此错误的帖子,但它们都是针对特定情况的。我正在制作一个文件拆分/连接器,它具有以下要求:-用户必须输入文件名/输入路径和输出文件夹。我用将原始文件拆分为 N 部分(用户必须输入)的基本
我是一名优秀的程序员,十分优秀!