0
我被這個EXC_BAD_ACCESS錯誤困住了。我正在使用zlib壓縮並保存函數deflateReadOut中的數組ch中的一些數據,該函數從函數generate中調用。該程序在標記行上的fwrite失敗。EXC_BAD_ACCESS在使用矢量類的底層數組進行fwrite時的錯誤
class WSUMap {
public:
vector<vector <unsigned char> > chunk;
int xComp[4];
int yComp[4];
vector<int> priority;
Hash hashChunk;
WSUMap()
{
chunk.resize(4);
chunk[0] = vector<unsigned char>(CHUNK);
chunk[1] = vector<unsigned char>(CHUNK);
chunk[2] = vector<unsigned char>(CHUNK);
chunk[3] = vector<unsigned char>(CHUNK);
priority.push_back(0);
priority.push_back(1);
priority.push_back(2);
priority.push_back(3);
xComp[0] = -1;
xComp[1] = -1;
xComp[2] = -1;
xComp[3] = -1;
yComp[0] = -1;
yComp[1] = -1;
yComp[2] = -1;
yComp[3] = -1;
}
void generate() {
for (int i = 0; i<CHUNK; i++) {
chunk[0][i]=100;
}
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
cout << chunk[0][0] << endl;
unsigned char* ch = &chunk[0][0];
cout << ch[0] << endl;
deflateReadOut(i, j, &chunk[0][0]);
}
}
}
void deflateReadOut(int x, int y, unsigned char* ch) {
int ret, flush;
unsigned have;
z_stream strm;
vector<unsigned char> out = vector<unsigned char>(CHUNK);
out.resize(CHUNK);
/* allocate deflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
if (ret != Z_OK) assert(true);
//return ret;
ostringstream oss;
oss << "map/" << x << "x" << y;
string str = oss.str();
cout << str << endl;
FILE* dest = fopen(str.c_str(), "w");
/* run deflate() on input until output buffer not full, finish
compression if all of source has been read in */
do {
strm.avail_out = CHUNK;
strm.avail_in = CHUNK;
strm.next_in = ch;
strm.next_out = &out[0];
ret = deflate(&strm, Z_FINISH); /* no bad return value */
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
have = CHUNK - strm.avail_out;
if (fwrite(&out[0], 1, have, dest) != have || ferror(dest)) {//ERROR HERE
(void) deflateEnd(&strm);
//return Z_ERRNO;
}
} while (strm.avail_out == 0);
assert(strm.avail_in == 0); /* all input will be used */
/* clean up and return */
(void) deflateEnd(&strm);
}
非常感謝您提供任何幫助。