【问题标题】:expression block type is valid // Stack overflow表达式块类型有效 // 堆栈溢出
【发布时间】:2015-04-12 10:44:39
【问题描述】:

尝试用 C++ 为我的大学构建一个项目。 尝试使用我在 Main.cpp 中为 MyDate 创建的方法 它不断让我堆栈 o/f 和“表达式块类型是有效的”错误。

main.cpp:

date1.setDay(8);
date1.setMonth(4);
date1.setYear(1994);
date1.setCmnt("Bday");      //problem with chars and pointers..
date1.print();
//Copy Constructor
date2 = date1;
date2.print();

我的日期.h:

void setCmnt(char *cmnt){
    if (cmnt!=nullptr)
        *c = *cmnt;
};

复制常量:

day=Date.day;
month=Date.month;
year=Date.year;
if (Date.c != nullptr)
{
    c = new char[strlen(Date.c) + 1];
    strcpy(c, Date.c);
    //*c = *Date.c;
}

tnx 非常感谢你们的帮助!!

【问题讨论】:

    标签: c++ pointers methods char copy-constructor


    【解决方案1】:

    您在 MyDate.h 中定义的函数 Date::setCmnt 仅将 Date::c 的第一个字符替换为输入字符串 cmnt 的第一个字符,而不是整个字符串。可能Date::c 甚至没有初始化,所以你在这里覆盖了一些随机内存。

    我强烈建议使用std::string 来处理字符串。但是,您要指出,这是针对大学的,也许您还没有被介绍给std::string,或者出于学术原因,您应该在这里与char* 一起工作。因此,我会在这个答案中选择char*

    Date::setCmnt 函数中,您需要像在复制 c'tor 中一样复制字符串。此外,如果 Date::c 已经分配了一个值 (!=nullptr),则应首先对其调用 delete[],以免造成内存泄漏。您还需要保证在您的类的每个构造函数中正确初始化Date::c(例如到nullptr)。

    例如:

    void setCmnt(char *cmnt){
        if (c!=nullptr)
            delete[] c;
        if (cmnt!=nullptr){
            c = new char[strlen(cmnt) + 1];
            strcpy(c, cmnt);
        }
        else c = nullptr;
    };
    

    【讨论】:

    • 首先,我要非常感谢您帮助我编写代码,其次 - 是的,我知道字符串,但我必须使用 char*。也 - 我从中学到了很多真正伟大的改进!谢谢!最后 - 我的错误仍然困扰着我 :( pic ; tinypic.com/r/2n87czr/8
    • 这可能意味着,您正在删除一个已被删除的指针。还要确保你没有存储任何临时对象的指针/引用。
    • 你是对的!我去了我的析构函数,这就是问题所在,{ if (c!=nullptr) delete[] c;} 我应该怎么做才能解决它?
    • 抱歉回复晚了。您可能尚未在构造函数中初始化 c。因此它有一些随机的、无效的内容。测试c!=nullptr 返回false 导致delete[] c,其中c 以前从未分配过。只需确保 c 在构造函数中初始化为 nullptr 就可以了。
    • 在我上面的评论中,我的意思是:测试c!=nullptr 返回true。混合起来......
    猜你喜欢
    • 2013-07-05
    • 2013-08-09
    • 2013-03-19
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2016-10-07
    • 2019-05-18
    • 2023-04-08
    相关资源
    最近更新 更多