[英]Several ifstreams access-violation
我试图实现一个外部合并排序( wiki ),我想打开2048个ifstream并将数据读取到个人缓冲区。
ifstream *file;
file = (ifstream *)malloc(2048 * sizeof(ifstream));
for (short i = 0; i < 2048; i++) {
itoa(i, fileName + 5, 10);
file[i].open(fileName, ios::in | ios::binary); // Access violation Error
if (!file[i]) {
cout << i << ".Bad open file" << endl;
}
if (!file[i].read((char*)perfile[i], 128*4)) {
cout << i << ". Bad read source file" << endl;
}
}
但是,它崩溃了
sorting.exe中0x58f3a5fd(msvcp100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xcdcdcdfd。
是否可以使用这么多打开的ifstream? 也许打开2048个ifstream是一个非常糟糕的主意,并且有更好的方法来实现此算法?
这是C ++。 ifstream
是非POD的,因此您不能只是对其进行malloc:需要构造实例
ifstream file[2048];
for (short i = 0; i < 2048; i++) {
itoa(i, fileName + 5, 10);
file[i].open(fileName, ios::in | ios::binary); // Access violation Error
if (!file[i]) {
cout << i << ".Bad open file" << endl;
}
if (!file[i].read((char*)perfile[i], 128*4)) {
cout << i << ". Bad read source file" << endl;
}
}
除此之外,打开2048个文件听起来不是一个好计划,但是您以后可以弄清楚
VS在调试模式下使用值0xcdcdcdcd
表示未初始化的内存(还要0xbaadf00d
)。
您使用的是c malloc
,它不调用构造函数,它只是为您提供了指向数据块的指针。 ifstream
不是POD(普通旧数据)类型。 它需要您调用其构造函数才能正确初始化。 这是C ++; 使用new
和delete
。
更好的是,不要使用任何一种。 只需在堆栈上构造事物,然后让它处理原本打算使用的动态内存分配。
当然,这甚至都没有涉及打开2048个文件的可怕想法,但是您可能应该以一种艰难的方式来学习它……
非POD对象的数组是使用new
分配的,而不是使用malloc
分配的,否则不会运行构造函数。
您的代码正在获取未初始化的内存,并将其“解释”为ifstream
,这显然会导致崩溃(因为没有运行类的构造函数,即使没有虚拟表指针也没有运行)。
您可以在堆栈上分配所有对象:
ifstream file[2048];
如果担心堆栈占用,则在堆上分配它们;
ifstream *file=new ifstream[2048];
// ...
delete[] file; // frees the array
(尽管您应该在此处使用智能指针以避免异常情况下的内存泄漏)
或者,最好使用ifstream
的vector
(需要标头<vector>
):
vector<ifstream> file(2048);
不需要显式释放其元素。
(理论上,您可以使用malloc
然后使用new
放置,但我完全不会推荐)
...此外,同时打开2048个文件并不是一个好主意...
您无法打开2048个文件,打开的文件有操作系统限制
据我所知,您实际上根本不需要2048个单独的ifstream
数组。 在任何给定时间只需要一个 ifstream,因此每次迭代都关闭一个文件,然后打开另一个文件。 销毁ifstream会自动关闭文件,因此您可以执行以下操作:
for (short i = 0; i < 2048; i++) {
itoa(i, fileName + 5, 10);
ifstream file(fileName, ios::in | ios::binary);
if (!file) {
cout << i << ".Bad open file" << endl;
}
if (!file.read((char*)perfile[i], 128*4)) {
cout << i << ". Bad read source file" << endl;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.