繁体   English   中英

几个ifstream访问冲突

[英]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 ++; 使用newdelete

更好的是,不要使用任何一种。 只需在堆栈上构造事物,然后让它处理原本打算使用的动态内存分配。

当然,这甚至都没有涉及打开2048个文件的可怕想法,但是您可能应该以一种艰难的方式来学习它……

非POD对象的数组是使用new分配的,而不是使用malloc分配的,否则不会运行构造函数。

您的代码正在获取未初始化的内存,并将其“解释”为ifstream ,这显然会导致崩溃(因为没有运行类的构造函数,即使没有虚拟表指针也没有运行)。

您可以在堆栈上分配所有对象:

ifstream file[2048];

如果担心堆栈占用,则在堆上分配它们;

ifstream *file=new ifstream[2048];
// ...
delete[] file; // frees the array

(尽管您应该在此处使用智能指针以避免异常情况下的内存泄漏)

或者,最好使用ifstreamvector (需要标头<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM