C++ *LPCSTR 奇怪的范围错误

标签 c++ scope

我目前有一个名为 TextureObject 的类。在创建函数中,我创建纹理,并将类中的 LPCSTR 分配给函数中给定的参数。当我稍后返回那个 LPCSTR 时,它以一种意想不到的方式返回。

某些类型名称和函数来自 DirectX 11,请忽略它们。

代码:

h 文件:

class TextureObject
{
public:
    ID3D11ShaderResourceView *pTexture;
    LPCSTR GetFilename() const { return *FFilename; }

    bool IsNotNull;
    void CreateTexture(ID3D11Device &dev,LPCSTR Filename);
    void ReCreate(ID3D11Device &dev);
    void Release();
    int relativeId;
private:
    LPCSTR *FFilename;
};

cpp文件:

void TextureObject::CreateTexture(ID3D11Device &dev,LPCSTR Filename)
{
    D3DX11CreateShaderResourceViewFromFile(
            &dev,        // the Direct3D device
            Filename,    // load Wood.png in the local folder
            NULL,        // no additional information
            NULL,        // no multithreading
            &pTexture,   // address of the shader-resource-view
            NULL);       // no multithreading
    FFilename = new LPCSTR(Filename);
    IsNotNull = true;
}

void TextureObject::ReCreate(ID3D11Device &dev)
{
    CreateTexture(dev, *FFilename);
}

在 CreateTexture 函数中使用 vs 2012 调试器时,文件名调试器值为:

0x0a06fed0 "C:\Users\Utilizador\Desktop\particle.png"

这对我来说是完美的!当我分配类的 FFilename 时:

FFilename = new LPCSTR(Filename);

没关系。当我在此函数范围内检查 FFilename 的值时,它与 Filename 的值相同。但是当我使用 GetFilename 时,事情开始变得疯狂:

 = 0x0a06fed0 "îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþü =I.C"

嗯,我刚认识你,这太疯狂了,但是……这是我的值(value)。米凯?

好吧,请帮帮我。谢谢你

最佳答案

您没有复制字符串。您正在复制指针。我认为您可能想要复制该字符串,因为您无法保证调用者的指针稍后仍会引用有效数据。

LPCSTR 只是一个 const char*。可能有相应的 Windows 调用,但我只会使用 strdup 来复制字符串。

FFilename定义为LPCSTR:

LPCSTR FFilename;

然后:

void TextureObject::CreateTexture(ID3D11Device &dev,LPCSTR Filename)
{
    D3DX11CreateShaderResourceViewFromFile(
            &dev,        // the Direct3D device
            Filename,    // load Wood.png in the local folder
            NULL,        // no additional information
            NULL,        // no multithreading
            &pTexture,   // address of the shader-resource-view
            NULL);       // no multithreading
    FFilename = strdup(Filename);
    IsNotNull = true;
}

void TextureObject::ReCreate(ID3D11Device &dev)
{
    CreateTexture(dev, FFilename);
}

由于您使用的是 C++,因此您可以自由地使用 std::string,当对象被销毁时,它会被自动清除。

关于C++ *LPCSTR 奇怪的范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039633/

相关文章:

C++ 指针或内存

python-3.x - 意外的元组解包,可能的范围问题/混淆

javascript - 如何保存点击链接的数据属性以便与 JavaScript 中的其他函数一起使用

c++ - 关闭函数时返回 vs break?

css - 我们可以将 CSS 关键帧动画限制在一个范围内吗

ruby-on-rails - 在不删除默认值 `*` 的情况下扩展 SELECT

c++ - 在 C++ 结构中显示垃圾值

c++ - 如何使用声明为私有(private)的结构?

c++ - TextOut 到设备上下文的中心

c++ - 变量具有内部链接但未定义