繁体   English   中英

递归可变参数模板函数在第二个参数类型上调用“丢失”指针

[英]recursive variadic template function call “loses” pointer on second argument type

我有一个使用可变参数模板的函数(GetArg s )来对参数(每个指针)进行排序,然后将每个函数发送到已为每种类型重载的另一个函数(GetArg)(目前为int和float)。 然后,每种类型的重载功能都会在指针处设置值。

它可以很好地编译,并且当我使用单个类型的许多参数调用函数时,它运行良好。 但是,如果我使用两种类型(float和int),它将运行良好,直到第二种类型的第一次出现,因为(从我所知道的)指针地址为空(调试器中为0x0)而崩溃。

这是我的函数定义(在main中包含的命名空间中声明):

namespace.h

int GetArg(int iStackPos,int *i);
int GetArg(int iStackPos,float *f);

template<typename tFirst> int GetArgs(tFirst first)
    {
        GetArg(-1,first);
    }

template<typename tFirst, typename... tRest> int GetArgs(tFirst first, tRest... rest)
    {
        int iStackPos = ((sizeof...(rest) + 1) * -1);


        GetArg(iStackPos,first);
        GetArgs((rest)...);

        return 0;
    }

namespace.cpp

int GetArg(int iStackPos,int *i)
    {
        *i = 1;
    }

int GetArg(int iStackPos,float *f)
    {
        *f = 2.5;
    }

调用以获取main中的args:

会运行良好:

int *i1;
float *f1;

namespace::GetArgs(f1,f1,f1,f1); //no use of int

会崩溃:

int *i1;
float *f1;

namespace::GetArgs(f1,i1,f1); //use of int

当int优先出现而后跟float时,情况也是如此。 空指针发生在递归GetArgs()调用中,并且发生崩溃是因为重载的int GetArg()试图写入该指针。 iStackPos用作lua堆栈上的位置,因为这意味着它是从lua获取参数的包装器。 但是我只用赋了int 1 float 2.5代替了lua代码,因为lua代码不是问题。

正如其他人已经建议的那样,您正在将未初始化的内存传递给函数。 这会产生不确定的行为。

另外,您不会在GetArg函数和第一个GetArgs返回任何内容。 这也会给您带来麻烦。

以及在计算iStackPos时结合使用size_t和int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM