C++ std::长度_错误内存位置0x00000A31EBFF050(带向量)
我正在创建一个应用程序,却被向量“重新分配”所困扰。我试图做的是传递tupleC++ std::长度_错误内存位置0x00000A31EBFF050(带向量),c++,C++,我正在创建一个应用程序,却被向量“重新分配”所困扰。我试图做的是传递tuple,其中第三个元素是指向向量的指针。这样做:Vector*pointer=&arr[length]。当我试着打印地址时,它的工作方式和预期的一样。尝试此操作时出现问题: (*get(*it))。调整大小(++get(*it)) 正在尝试重新分配,如(*指针).resize()工作 我想做的是tuple(类似于关系数据库): tuple是唯一id、该id的条目数、指向该行第一个元素地址的指针 所以基本上,我将有一个元组,其
,其中第三个元素是指向向量的指针。这样做:Vector*pointer=&arr[length]代码>。当我试着打印地址时,它的工作方式和预期的一样。尝试此操作时出现问题:
(*get(*it))。调整大小(++get(*it))代码>
正在尝试重新分配,如(*指针).resize()代码>工作
我想做的是tuple(类似于关系数据库):
tuple
是唯一id、该id的条目数、指向该行第一个元素地址的指针
所以基本上,我将有一个元组,其中包含关于唯一ID的基本信息、每个IP的行数以及指向该特定行的指针
当IP第一次出现时,它被添加到元组中,并且它的数据存储在第一位。彼此相同的IP将在元组中进行检查,当发现时,其数据需要存储在下一个可用空间中(大小调整为1)。希望不要太复杂而难以理解
下面是我当前使用的代码:(注意变量a
的类型是Log
)
typedef向量查找\u列表;
查找列表查找;
向量arr;
向量*指针;
整数长度=0;
字符串ip;
对于(int i=0;i
我得到的错误基本上是要么试图访问超出边界的内存,要么是长度错误(“向量太长”)
应该注意,这发生在大小相同的第一个IP上,因此不确定为什么会触发该错误…pointer=&arr[length];…查找。向后推(元组(IP,1,指针))
--您不应该像代码试图做的那样存储指向向量项的指针。如果调整向量的大小,这些指针值可能会失效。@PaulMcKenzie感谢您的快速回答。但是如果这些信息不应该位于向量中,我可以将它们存储在哪里?存储在向量中,但不要使用指针或是v非常小心如何使用指向它的指针。非常有帮助的阅读。对于向量
而言,指针和迭代器几乎是一样的(但并非所有容器都是一样的)。@Aljosa--您可以尝试std::list
,如果添加或删除项,指针不会失效(假设您没有删除指向的当前项)。pointer=&arr[length];…查找。向后推(元组(ip,1,指针))
--您不应该像代码试图做的那样存储指向向量项的指针。如果调整向量的大小,这些指针值可能会失效。@PaulMcKenzie感谢您的快速回答。但是如果这些信息不应该位于向量中,我可以将它们存储在哪里?存储在向量中,但不要使用指针或是v非常小心如何使用指向它的指针。非常有帮助的阅读。对于向量
而言,指针和迭代器几乎是一样的(但并非所有容器都是一样的)。@Aljosa--您可以尝试std::list
,如果添加或删除项,指针不会失效(假设您没有删除指向的当前项)。
typedef vector<tuple<string, int, vector <Log>*>> lookup_list;
lookup_list lookup;
vector<vector<Log>> arr;
vector <Log> *pointer;
int length = 0;
string ip;
for (int i = 0; i < arr_size; i++){
ip = a[i].ip_address;
auto it = find_if(lookup.begin(), lookup.end(), [ip](const tuple<string, int, vector <Log>*>& e){
return get<0>(e) == ip;
});
if (it == lookup.end()){
arr.resize(length + 1);
arr[length].resize(1);
pointer = &arr[length];
arr[length][0] = a[i];
lookup.push_back(tuple<string, int, vector <Log> *>(ip, 1, pointer));
length++;
}
else {
get<1>(*it)++;
(*get<2>(*it)).resize(get<1>(*it));
(*get<2>(*it))[(get<1>(*it))-1] = a[i];
}