【问题标题】:C++ Memory violation error when trying to use function with variable of arguments尝试使用带有参数变量的函数时出现 C++ 内存冲突错误
【发布时间】:2020-08-31 12:20:14
【问题描述】:

我想创建一个函数,它将信息记录到文件中。这个函数需要获取一些参数并且应该遍历它们并将它们打印到控制台。我有以下代码:

void log(int argnum ...)
{
    va_list arguments;
    std::string argval;
    va_start(arguments, argnum);

    for (int i = 0; i < argnum; i++) {
        argval = va_arg(arguments, std::string);
        std::cout << argval;
    }

    va_end(arguments);
}

当我尝试这样调用函数时:

log(10, "somebody", "once", "told", "me",
        "the", "world", "is", "gonna", "roll", "me");

Visual Studio 打开“memcpy.asm”,出现访问冲突错误。知道有什么问题吗?

【问题讨论】:

  • "somebody" 还是 int ?大多数时候可变参数函数模板是更好的选择
  • 这些都不是std::strings,他们是const char*s。
  • 为什么人们在今天的 c++ 代码中使用这种痛苦的 70 年代初期的 C 宏?为什么不简单地std::vector&lt;std::string&gt;&gt;&amp;
  • 所有可变参数函数都是 C 函数。他们不懂 C++ 对象。

标签: c++ parameter-passing variadic-functions


【解决方案1】:

坦率地说,您的代码有点乱。你声明log 接受int 类型的参数:

void log(int argnum ...)

然后您尝试将它们设为std::strings:

argval = va_arg(arguments, std::string);

然后您尝试使用intconst char[] 类型的参数调用函数。此外,您似乎对如何处理参数数量有一个误解。

大多数时候,可变参数函数模板是可变参数函数的更好选择:

#include <iostream>

template <typename ...T>
void log(const T& ... args)
{
    (std::cout << ... << args) << '\n';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多