该程序工作正常,直到您对名为 tsp 的数组使用确定的大小,然后它会给出分段错误。
std::cout<<"point1"<<std::endl;
vector< pair< int, float > > valores ;
std::cout<<"point2"<<std::endl;
cargar_vector_valores(valores, defenses);
std::cout<<"point3"<<std::endl;
unsigned int cost = 0;
std::cout<<"point4"<<std::endl;
//copiar lista de defenses a vector
vector<Defense*> copia_defenses;
std::cout<<"point5"<<std::endl;
for(std::list<Defense*>::iterator it=++defenses.begin();it != defenses.end();it++){
copia_defenses.push_back((*it));
}
std::cout<<"point6"<<std::endl;
std::cout<<"defenses.size()-1="<<defenses.size()-1<<std::endl;
std::cout<<"cols = "<<ases+1<<std::endl;
int rows=defenses.size()-1;
int cols=ases+1;
int tsp [rows][cols];
std::cout<<"point7"<<std::endl;
selectedIDs.push_back((*defenses.begin())->id);
std::cout<<"point8"<<std::endl;
ases-=(*defenses.begin())->cost;
std::cout<<"point9"<<std::endl;
这是程序之外的
point1
point2
point3
point4
point5
point6
defenses.size()-1=165
cols = 12769
Segmentation fault (core dumped)
创建数组时转储的内核。我不知道有什么问题。
正如注释中指出的,您正在尝试在堆栈上分配太多内存。 165*12769 = 2106885整数 如果我们认为 int 在您的系统上是 32 位,我们会得到 8230 KiB,这超过了 Linux 上的堆栈大小(通常为 8192 KiB,您可以使用 shell 命令 $ulimit -s 进行验证)。考虑到其他变量和程序中的所有内容,您将通过该限制。相反,您应该在堆上分配内存,无论是使用新的还是使用 std 结构(如 std::vector)。
此外,正如约阿希姆·皮尔伯格所指出的,
int tsp [rows][cols];
不是标准C++,因为您的行和列不是在编译时确定的。您的编译器正在使用可变长度数组扩展来使其工作,但这不适用于所有编译器,因此它成为您想要避免的事情。