c++ - 使用 strcat 进行堆损坏

标签 c++

我的弱点之一是在 C++ 中有效地使用字符,这正是我现在正在尝试做的。我的游戏中有一个玩家类,在玩家类中,我创建了一个显示各种信息的playerCard 对象。这对于玩家对象的单个实例(即玩家玩家)来说效果很好,但是当我尝试将玩家对象推回到 vector 中时,一切都会出错。

基本上,程序会继续运行,但播放器不会渲染到屏幕上。当我退出程序时,当 main 尝试返回 MSG 时,我收到断点错误。关于断点的注释如下:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

我已经将错误定位到这里

    strcat(nameCard, nameChar);
    strcat(nameCard, genderChar);
    strcat(nameCard, ageChar);
    strcat(nameCard, cashHeldChar);
    strcat(nameCard, productWantedChar);

在playerCard类中,因为当我注释掉它时,我没有收到错误。这是完整的playerCard类(同样,它很困惑,而且可能是错误的处理方式,但我正在尝试使用字符/字符串等来解决问题) #include“Headers.h”;

class Playercard{

private:

    RECT textbox;
    LPD3DXFONT font;

    std::string nameStr;
    std::string genderStr;
    std::string ageStr;
    std::string cashHeldStr;
    std::string prodWantedStr;

    char nameCard[1000];

public:

    Playercard()
    {
    }

    void load(char* name, bool male, int age, double cash, char* prod)
    {

        if(male)
        {
            genderStr = "Gender: Male\n";
        }
        else
        {
            genderStr = "Gender: Female\n";
        }

        nameStr = "Name: " + static_cast<std::ostringstream*>( &(std::ostringstream() << name))->str() + "\n";
        ageStr = "Age: " + static_cast<std::ostringstream*>( &(std::ostringstream() << age))->str() + "\n";
        cashHeldStr = "Cash Held: " + static_cast<std::ostringstream*>( &(std::ostringstream() << cash))->str() + "\n";
        prodWantedStr = "Product Wanted: " + static_cast<std::ostringstream*>( &(std::ostringstream() << prod))->str() + "\n";

        char * nameChar = new char [nameStr.length()+1];
        char * genderChar = new char [genderStr.length()+1];
        char * ageChar = new char [ageStr.length()+1];
        char * cashHeldChar = new char [cashHeldStr.length()+1];
        char * productWantedChar = new char [prodWantedStr.length()+1];

        strcpy(nameChar, nameStr.c_str());
        strcpy(genderChar, genderStr.c_str());
        strcpy(ageChar, ageStr.c_str());
        strcpy(cashHeldChar, cashHeldStr.c_str());
        strcpy(productWantedChar, prodWantedStr.c_str());

        strcat(nameCard, nameChar);
        strcat(nameCard, genderChar);
        strcat(nameCard, ageChar);
        strcat(nameCard, cashHeldChar);
        strcat(nameCard, productWantedChar);

        diagFile.open("Diag.txt");
        diagFile.write("Test", 100);
        diagFile.close();
    }

    void setUp(int L, int T, int R, int B)
    {
        SetRect(&textbox, L,T,R,B);
    }

    void draw()
    {
        font->DrawTextA(d3dSprite, nameCard, -1, &textbox, DT_LEFT, D3DCOLOR_XRGB(255, 255, 255));
    }

    LPCSTR plCard()
    {
        return nameCard;
    }
};

任何帮助将不胜感激。谢谢。

最佳答案

您的nameCard未初始化。将第一个 strcat 替换为 strcpy,或使用零字符串对其进行初始化。

现在,单独使用 std::string 怎么样?

关于c++ - 使用 strcat 进行堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677195/

相关文章:

c++ - 使用声明修改派生类中的访问说明符

java - 数学密集型、基于计算的网站 - 我应该使用哪种语言?

c++ - 琐碎的 “Not declared in this scope”错误

c++ - cin 对象 - C++

c++ - ifstream 不会读取整数或其他任何与此相关的内容

c++ - gcc的转储文件.c.135r.jump中的静态方法在哪里

C++ scanner.h 扫描双引号之间的内容作为标记 : not skipping spaces inside quotes

c++ - 为每个测试用例或整个测试套件调用谷歌测试函数 setup() 和 teardown()

c++ - DirectX CreateBuffer 内存泄漏

c++ - 带有 char[] 的 cin/cout