我使用可变参数模板获取了一个函数(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首先出现并且之后浮动时也是如此。 空指针发生在递归GetArgs()调用中,并且发生崩溃是因为重载的int GetArg()尝试写入该指针。 iStackPos用作lua堆栈上的位置,因为这是一个从lua获取参数的包装器。但是,我只是通过分配int 1 ,float 2.5 来替换lua代码,因为lua代码不是问题。
答案 0 :(得分:0)
正如其他人已经建议的那样,您将未初始化的内存传递给您的函数。这会产生不确定的行为。
此外,您未在GetArg
函数和第一个GetArgs
中返回任何内容。这也会让你陷入麻烦。
在计算iStackPos时你将size_t和int结合起来。