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来保存二进制数据。@UnholySheep
std::function
是一种胖类型,它比您通常需要的要多,但成本很高。这不是一个好的选择default@tyranid你说得对.我没想到.谢谢。