C++ c++;指向函数的指针和空指针是导致wierd事件的操作
我正在家里做一个关于遗传算法的小项目。但我试图使它通用,所以我使用指针来函数和无效指针。但我认为这可能会带来一些问题 本部分项目的主要目标是获取指向函数的指针,该函数返回特定的结构。包含空指针的结构 当我试图观察它所指向的地方的价值时,它也不完全正确。我怀疑这两者之间的相互作用可能会给我带来一些问题 详情: 结构:C++ c++;指向函数的指针和空指针是导致wierd事件的操作,c++,struct,function-pointers,void-pointers,C++,Struct,Function Pointers,Void Pointers,我正在家里做一个关于遗传算法的小项目。但我试图使它通用,所以我使用指针来函数和无效指针。但我认为这可能会带来一些问题 本部分项目的主要目标是获取指向函数的指针,该函数返回特定的结构。包含空指针的结构 当我试图观察它所指向的地方的价值时,它也不完全正确。我怀疑这两者之间的相互作用可能会给我带来一些问题 详情: 结构: struct dna_s{ int size; void *dna; }; 人口是一类包含所有人口的过程。此外,它还包含两个函数:i
struct dna_s{
int size;
void *dna;
};
人口是一类包含所有人口的过程。此外,它还包含两个函数:init_func和fitter_func,它们都是指向函数的指针
指向函数定义的指针:
typedef dna_s (*init_func_t)();
typedef int (*fitter_func_t)(dna_s);
人口类别:
class population{
private:
// Parameters
int population_size;
node *pop_nodes;
// Functions
init_func_t init_func;
fitter_func_t fitter_func;
public:
population(int pop_size,init_func_t initialization_func){
// Insert parameters into vars.
this->population_size = pop_size;
this->init_func = initialization_func;
// Create new node array.
this->pop_nodes = new node[this->population_size];
for(int i = 0;i < this->population_size; i++){
dna_s curr_dna = this->init_func();
char *s = static_cast<char*>(curr_dna.dna);
cout << s << endl;
this->pop_nodes[i].update_dna(curr_dna);
}
}
};
现在来看有趣的部分,问题是什么?
在init_func中,cout打印:
-->e%wfF
e%Ω²(
这一切都很好
但在人口类别中,cout打印:
-->e%wfF
e%Ω²(
最重要的是,前2个字符总是相同的,但其他3个字符总是这个字符串。
例如:
您的代码存在一些生命周期问题。在您的dna结构中:
void *dna;
这是一个指针,它指向其他地方存在的对象。然后,在init_func中:
dna_s init_func(){
string alphanum = "0123456789!@#$%^&*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char init_s[STRING_SIZE+1] = {};
dna_s dna;
// Generate String
for(int i = 0; i < STRING_SIZE; i++){
init_s[i] = alphanum[rand() % alphanum.size()];
}
cout << "-->" << init_s << endl;
// Insert into struct.
dna.size = STRING_SIZE;
dna.dna = static_cast<void*>(&init_s);
// Return it
return dna;
}
dna_s init_func(){
...
char init_s[STRING_SIZE+1] = {};
dna_s dna;
...
dna.dna = static_cast<void*>(&init_s);
...
return dna;
}
dna_s init_func(){
...
char init_s[STRING_SIZE+1]={};
脱氧核糖核酸;
...
dna.dna=静态施法(初始化);
...
返回dna;
}
init_s
是一个存在于init_func
内部的变量,您使dna
指向该变量,然后离开该函数。init_s
此时不再存在,dna
在population
构造函数获得它时指向任何有用的地方,导致未定义的行为
您可以通过使用
new char[]
分配内存来解决这个问题,就像您对pop_节点所做的那样,但是当不再使用内存时,您有责任删除该内存。您使用指针有什么特别的原因吗(以这种方式,是特定的,并且根本不需要)?C++11引入了std::function
,它比您正在尝试的操作更容易、更安全,我真的不明白您为什么在结构中使用void*
,它不需要真正的答案。您的问题是返回堆栈上的变量指针,然后该变量会被其他内容覆盖。您不需要o使用new char[]或更好的方法在堆上分配一个缓冲区,但只需使用一个通用容器,如std::vector来保存二进制数据。@UnholySheepstd::function
是一种胖类型,它比您通常需要的要多,但成本很高。这不是一个好的选择default@tyranid你说得对.我没想到.谢谢。