【问题标题】:CString to char*CString 到 char*
【发布时间】:2010-10-08 06:02:51
【问题描述】:

我们在大部分代码中都使用 CString 类。但是有时我们需要转换为 char *。目前我们一直在使用 variable.GetBuffer(0) 执行此操作,这似乎有效(这主要发生在将 Csting 传递给函数需要 char * 的函数时)。该函数接受了这一点,我们继续前进。

但是我们最近开始担心这是如何工作的,以及是否有更好的方法来做到这一点。

我理解它的工作方式是将一个 char 指针传递给指向 CString 中第一个字符的函数,并且一切正常。

我想我们只是担心内存泄漏或任何不可预见的情况,这可能不是一个好主意。

【问题讨论】:

    标签: c++ mfc memory-leaks cstring


    【解决方案1】:

    如果您的函数只需要读取字符串而不需要修改它,请将它们更改为接受const char * 而不是char *。 CString 会自动为您转换,这是大多数 MFC 功能的工作方式,非常方便。 (实际上 MFC 使用 LPCTSTR,它是 const TCHAR * 的同义词 - 适用于 MBC 和 Unicode 构建)。

    如果您需要修改字符串,GetBuffer(0) 非常危险 - 它不一定会为生成的字符串分配足够的内存,并且您可能会遇到一些缓冲区溢出错误。

    正如其他人所提到的,您需要在GetBuffer之后使用ReleaseBuffer。您无需为转换为const char * 执行此操作。

    【讨论】:

    • 我已经尝试过 strtol() 并且它不会自动从 CString 转换为 const char *。你是怎样做的?我也尝试了类型转换,也不起作用。
    • @henryyao 改用_tcstol。
    【解决方案2】:

    @ OP: >>> 我想我们只是担心内存泄漏或任何...

    您好,调用 GetBuffer 方法不会导致任何内存泄漏。因为析构函数无论如何都会释放缓冲区。但是,其他人已经警告过您调用此方法的潜在问题。

    @Can >>> 当你调用 getbuffer 函数时,它会为你分配内存。

    这种说法并不完全正确。 GetBuffer(0) 不分配任何内存。它只返回一个指向内部字符串缓冲区的指针,该缓冲区可用于直接从 CString 类的“外部”操作字符串。

    但是,如果你传递一个数字,比如 GetBuffer(N) 给它说 N,并且如果 N 大于缓冲区的当前长度,则该函数确保返回的缓冲区至少与 N 一样大分配更多内存。

    干杯, 拉杰什。 MVP,Visual ++。

    【讨论】:

      【解决方案3】:

      当您调用 getbuffer 函数时,它会为您分配内存。 完成后,需要调用 releasebuffer 来释放它

      【讨论】:

        【解决方案4】:

        尝试http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx 的文档以获取相关帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 2015-08-07
          • 2011-11-02
          • 2020-06-12
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多