【问题标题】:in c++, if I pass a CString to a function by reference and assign it to another CString it is truncated在 C++ 中,如果我通过引用将 CString 传递给函数并将其分配给另一个 CString,则它会被截断
【发布时间】:2011-11-10 22:58:22
【问题描述】:

一些简单的代码在我一直在使用的 sdk 中开始失败,而且它显然已经正常工作了很长时间,事实上我几乎肯定我已经编译了这样的部分代码并且他们已经工作,但最近失败了。

在调试器中确认值的示例:

void SomeFunction(CString& paramstring) //let's pretend we pass a string with the value "hello"
{
     int size=paramstring.GetLength(); //size now contains an incorrect shorter value like 4
     CString localstring=paramstring;//localstring contains something like "hell" or "hel"
}

任何想法为什么会发生这种情况

【问题讨论】:

  • 给您的提示:粘贴代码时,将其全部突出显示并点击{} 按钮以正确格式化。
  • 在这个简短的示例中一定有一些你没有透露的信息,因为它绝对没有失败的理由。
  • 你在用 CString 做什么?您是否以任何方式对其进行修改?在你将它传递给函数之前它是什么样子的?
  • @Zack 我认为它是 M$oft ATL 类。
  • 它是 MFC。使用 M$ 充其量是微不足道的。

标签: c++ pass-by-reference truncate cstring


【解决方案1】:

我在控制台应用程序中尝试了您的代码,它完美运行问题来自您代码的另一部分这里是代码尝试一下(使用 MFC)

#include <iostream>
#include <afx.h>
using namespace std;

//let's pretend we pass a string with the value "hello"
void fun(CString& paramstring)
{
    int size=paramstring.GetLength();  
    cout<<"size= "<<size<<"\n";
    CString localstring=paramstring;
    wcout<<"string = "<<(LPCTSTR)localstring<<"\n";
}

int main()
{
    CString s ("Hello");
    fun(s);
}

输出:

大小 = 5 字符串 = 你好

【讨论】:

    【解决方案2】:

    我唯一的猜测是你有一个内存覆盖破坏了那个对象。

    是时候拿出电动工具了。安装 Purify 或 Boundschecker 并找出您的错误。

    【讨论】:

    • 谢谢。不幸的是,我无权访问源代码的那部分。我正在使用插件 sdk,这是我要覆盖的功能。
    【解决方案3】:

    过去我在 CString 代码中犯了一个错误,它在作为参数传递时阻止了 CStrings 正常工作。您的问题可能完全不同,但我将在这里解释导致问题的原因,因为它可能对某人有所帮助。

    我的 CString 包含一个目录名称。为了稍微清理一下,我检查了最后一个字符是否是“\”,如果是,我通过直接覆盖 CString 中的字符将其替换为“\0”。

    这可能以某种方式破坏了 CString 的完整性,因为它会在 strlen() 等测量的字符串长度与缓冲区的实际大小之间产生不匹配。我对问题的解释可能不正确,但我认为它基本上归结为我破坏了 CString 的完整性。

    我通过将我的陈述替换为类似的内容来解决我的问题 dirname=dirname.Left(dirname.GetLength()-1);

    我是凭记忆写的,不经常使用函数,如果我记得函数名称不正确,请原谅我。无论如何,我的建议是不要将空字符写入 CString 的中间来缩短它,并且如果 CStrings 作为参数出现问题,则查找它(除其他外)。

    啊,是的,我认为问题可能与您的相反。如果您通过覆盖字符来缩短字符串,那么 GetLength() 可能会返回旧值,该值比您预期的要大。

    我的实际问题是 dir + "\" + filename 不起作用。我想它正在连接包含 null 的字符串,并且最终值只是目录部分,因为那是添加 null 的地方。

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2019-05-13
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多