gpt4 book ai didi

c++ - 递归可变参数模板函数调用 "loses"指针在第二个参数类型上

转载 作者:太空宇宙 更新时间:2023-11-04 13:21:37 26 4
gpt4 key购买 nike

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

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

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

命名空间.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;
}

命名空间.cpp

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

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

在 main 中调用以获取参数:

运行良好:

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 获取参数的包装器。但是,我已经将 lua 代码替换为仅分配 int 1、float 2.5,因为 lua 代码不是问题所在。

最佳答案

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

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

以及您在计算 iStackPos 时组合 size_t 和 int。

关于c++ - 递归可变参数模板函数调用 "loses"指针在第二个参数类型上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35059085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com