【问题标题】:Is that possible to cast c++ operator new output? [closed]是否可以强制转换 c++ 运算符新输出? [关闭]
【发布时间】:2019-08-29 08:37:59
【问题描述】:

我编写了以下函数,它将打印出环境变量的值,但是当我编译它时,它显示以下错误:

 error C2760 : syntax error : unexpected token 'new', expected ';'
warning C4244: 'initializing': conversion from 'DWORD' to 'TCHAR', possible loss of data

我写的代码:

template<typename T>
void EnvironmentVariableParser(T arg_variable_name) 
{
    PTSTR pszTemp, pszValue = NULL;
    auto dwResult = GetEnvironmentVariable(arg_variable_name, pszValue, 0);

    if (dwResult != 0) 
    {
        auto size = dwResult * sizeof(TCHAR);
        pszTemp = new PTSTR(size);
        pszValue = reinterpret_cast<PTSTR>(pszTemp);
        GetEnvironmentVariable(arg_variable_name, pszValue, size);
        std::cout << arg_variable_name << "=" << pszValue << std::endl;
        delete pszValue;
    } 
    else 
    {
        std::cout << arg_variable_name << "=<unknown value>" << std::endl;
    }

}

是否可以将新的运算符输出转换为 PTSTR 之类的东西?

【问题讨论】:

  • 正确的语法是pszValue = new TCHAR[size];,同样free(pszValue);也是无效的,因为它不匹配分配。
  • 您不能将malloc(x) 替换为new x。有好书清单here.
  • OT:operator new 可能是指new-expression。只是不要与operator new 混淆。
  • 我个人建议不要使用匈牙利符号。它带来的问题多于解决的问题......
  • @Adrian 没错。我从未见过他们实际上优于TCHAR* 等等的例子。它们对应的基本类型(TCHAR 本身)是另一个主题。匈牙利符号(前缀如pszi、...),而不是匈牙利名称。不过,关于后者:与任何其他非英文名称相同:您陷入不得不与其他人共享您的代码的情况下,有一天不说该语言(如果只是在 SO ),任何非英语标识符都会使理解这些代码背后的意图变得更加困难......

标签: c++ windows visual-studio


【解决方案1】:

给出的 cmets 是一些答案,但并不精确。您需要的代码修复(使用 cmets)是:

auto size = dwResult * sizeof(TCHAR); // Maybe not needed (see notes).
pszValue = new TCHAR[dwResult];       // NOTE: Not 'size'!!!
GetEnvironmentVariable(arg_variable_name, pszValue, size);
std::cout << arg_variable_name << "=" << pszValue << std::endl;
delete[] psvValue;                    // Don't use: free(pszValue);

我不知道GetEnvironmentVariable 函数的第三个参数是什么:它是缓冲区的实际大小(以字节为单位)还是最大值。 TCHARS 的数量?如果是后者,你给它dwResult 并且永远不需要size

希望这会有所帮助!

编辑:刚刚检查:第三个参数 TCHAR 计数,所以你可以完全不用 size !!

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2017-01-23
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多