unsigned char *q_dsc, *r_dsc;
q_dsc = new unsigned char [MAX_DSC_LENGTH];
r_dsc = new unsigned char [MAX_DSC_LENGTH];
if ((q_file = fopen (q_fname.c_str(), "rb")) == NULL)
traceMgr.start("no q_file");
if ((q_dsc_len = (int)fread (q_dsc, 1,MAX_DSC_LENGTH, q_file)) <= 0)
traceMgr.start("no qdsc_file");
__android_log_print(ANDROID_LOG_INFO, "JNIMsg2","Q: %d , %p ", q_dsc_len,&q_dsc);
fclose (q_file);
if ((r_file = fopen (r_fname.c_str(), "rb")) == NULL)
traceMgr.start("no r_file");
if ((r_dsc_len = (int)fread (r_dsc, 1, MAX_DSC_LENGTH, r_file)) <= 0)
traceMgr.start("no rdsc_file");
__android_log_print(ANDROID_LOG_INFO, "JNIMsg1","R: %d , %p", r_dsc_len,&r_dsc);
fclose (r_file);
.....
我试图打印fread指针的地址,得到的结果是
01-24 16:13:46.791: I/JNIMsg2(18576): Q: 1020 , 0xbe85ead8
01-24 16:13:46.791: I/JNIMsg1(18576): R: 991 , 0xbe85eadc
这与无效堆有很大不同。
此外,我试着在for循环中只读一次,这样就不会出现崩溃。
for (size_t i=0; i<n_matching_pairs; i++)
/* read descriptors: */
......
unsigned char *q_dsc, *r_dsc;
q_dsc = new unsigned char [MAX_DSC_LENGTH];
r_dsc = new unsigned char [MAX_DSC_LENGTH];
if ((q_file = fopen (q_fname.c_str(), "rb")) == NULL)
traceMgr.start("no q_file");
if ((q_dsc_len = (int)fread (q_dsc, 1,MAX_DSC_LENGTH, q_file)) <= 0)
traceMgr.start("no qdsc_file");
__android_log_print(ANDROID_LOG_INFO, "JNIMsg2","Q: %d , %p ", q_dsc_len,&q_dsc);
fclose (q_file);
或者像这样减少文件读取范围的大小,也不会崩溃。
(MAX_DSC_LENGTH = 1024*32 --> decrease this to 100 would work, but 200 would crash again....)
for (size_t i=0; i<n_matching_pairs; i++)
/* read descriptors: */
......
unsigned char *q_dsc, *r_dsc;
q_dsc = new unsigned char [MAX_DSC_LENGTH];
r_dsc = new unsigned char [MAX_DSC_LENGTH];
if ((q_file = fopen (q_fname.c_str(), "rb")) == NULL)
traceMgr.start("no q_file");
if ((q_dsc_len = (int)fread (q_dsc, 1,100, q_file)) <= 0)
traceMgr.start("no qdsc_file");
__android_log_print(ANDROID_LOG_INFO, "JNIMsg2","Q: %d , %p ", q_dsc_len,&q_dsc);
fclose (q_file);
if ((r_file = fopen (r_fname.c_str(), "rb")) == NULL)
traceMgr.start("no r_file");
if ((r_dsc_len = (int)fread (r_dsc, 1, 100, r_file)) <= 0)
traceMgr.start("no rdsc_file");