在c++中,如果我通过引用将CString传递给函数并将其分配给另一个CString,它将被截断

in c++, if I pass a CString to a function by reference and assign it to another CString it is truncated

本文关键字:CString 函数 另一个 分配 如果 c++ 引用      更新时间:2023-10-16

一些简单的代码已经开始在我一直在使用的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"
}

知道为什么会这样吗

我已经在控制台应用程序中尝试了您的代码,它工作得很好,问题来自您的代码的另一部分这里是代码尝试一下(使用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);
}
输出:

size = 5 string = Hello

我唯一的猜测是您有内存覆盖损坏了该对象。

是时候拿出电动工具了。安装Purify或者Boundschecker,然后寻找你的bug。

我在过去的CString代码中犯了一个错误,它在作为参数传递时阻止了CString正确工作。你的问题可能完全不同,但我将在这里解释我做了什么导致了问题,因为它可能会帮助别人。

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

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

我修复了我的问题,将我的语句替换为类似的东西目录名= dirname.Left (dirname.GetLength () 1);

我是凭记忆写这篇文章的,不经常使用这些函数,所以如果我记错了函数名,请原谅我。无论如何,我的建议是不要将空字符写入CString的中间以缩短它,并且如果将CString作为参数出现问题,则查找(除其他事项外)。

啊,是的,我想问题可能和你的正好相反。如果您通过覆盖一个字符来缩短字符串,那么GetLength()可能会返回旧值,该值比您可能期望的要大。

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