我有一大堆代码:
void split(std::vector<std::string> * v,const char* s,const char* x) {
size_t len = strlen(s);
size_t slen = strlen(x); //slen = Search Length
if(len==0||slen==0)
return;
v->clear();
char* f = new char[len];
memset(f,0,len);
int * counter =new int;
(*counter)=0;
for(unsigned int i = 0; i<len; i++) {
if(isNext((s+(i*sizeof(char*))),x)) {
f[i]=1;
counter++;
}
}
if((*counter)==0) {
delete [] f;
delete counter;
v->clear();
return;
}
...
但是,当我使用gdb(在cygwin上)或visual studio调试器进行调试时,我收到此错误(来自cygwin控制台)
(gdb) step
36 if(len==0||slen==0)
(gdb) step
38 v->clear();
(gdb) step
std::vector<std::string, std::allocator<std::string> >::clear (
this=0x60003a3e0)
at /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/include/c++/bits/stl_vector.h:1126
1126 { _M_erase_at_end(this->_M_impl._M_start); }
(gdb)
无论我在哪里编译它都会得到同样的错误!当我检查 gdb 中所有变量的值时,一切都是正确的(值正是它们应该是的)。该向量确实有效,因为我在 main()中初始化它,使用它然后删除它并重新分配它(所有没有问题)。我在这里错过了一些大事吗?谷歌搜索和调试几个小时似乎没有带来任何东西。任何帮助表示赞赏!
答案 0 :(得分:0)
这里有很多可以简化的,但就主要问题而言:
int * counter =new int;
(*counter)=0;
counter++;
计数器++正在递增指针而不是指向的值。我没有看到任何理由为什么这需要成为一个指针,应该避免,因为它只会增加复杂性。
isNext
做什么?你可以做很多事情来做到这一点,当它完成时它可能会减少问题。
你要分开什么?如果向量未初始化,则对->clear()
的调用可能会导致访问冲突。