繁体   English   中英

变量周围的堆栈损坏了C ++

[英]Stack around the variable is corrupted c++

Contact::Contact(const char* name2, const long long * phone2, int num2) {

    bool safe = name2== nullptr && phone2 == nullptr && num2 == 0;

    if (safe) {

        *this = Contact();

    }
    else {
        strcpy(name, name2);
        name[19] = '\0';
        bool valid = phone2 != nullptr && num2 > 0;
        if (valid) {
            int count = 0;

            for (int i = 0; i < num2; i++) {
                valid = phone2[i] > 10000000000LL && phone2[i] < 999999999999LL;  // PROBABLY A GOOD IDEA TO MAKE A FUNCTION TO CHECK VALIDNESS
                if (valid) count++;
            }

            num = count;
            phone = new long long[num];

            for (int i = 0, j = 0; i < num2; i++) {
                if (phone2[i] > 10000000000LL && phone2[i] < 999999999999LL) {
                    phone[j] = phone2[i];
                    j++;
                }
            }
        }
        else {
            num = 0;
            phone = nullptr;
        }
    }

}

这是我的3个参数构造函数。 我不断收到错误消息,该变量周围的堆栈已损坏。 但是,当我摆脱第3行中的name2==nullptr时,它可以正常工作而不会出现错误(尽管输出与我想要的不完全相同)。 我在那里做错了吗?

假设name2 == nullptr ,但是phone2 != nullptr 这意味着save将为false,并且将执行strcpy(name, name2) ,它将尝试从nullptr复制。 根据操作系统的不同,这可能会给您带来访问冲突(禁止对地址0的读取访问),也可能不会。 我的猜测是,允许读取访问。

因此, strcpy将尝试在地址0处复制一个完全伪造的字符串。它将复制char直到遇到\\0 char。

在几乎所有情况下,这都将比成员变量name ,从而覆盖那里的内存。

如果更改save = stuff && stuffsave = name2==nullptr || phone2==nullptr save = name2==nullptr || phone2==nullptr错误可能会消失。

但是您的代码通常非常糟糕(意味着不安全,容易出错)。

您不应该在2018年再使用strcpy。 使用std :: string代替。 使用* this = Contact()可能是错误的。 完全构造对象之前,您要在此处调用赋值运算符( operator= )。

删除条件name2== nullptr会使代码进入安全路径,即使name2 != nullptr ,您也会在该路径中获得默认的构造联系人。

如果name2 != nullptr那么您使用name2 == nullptr进入else部分,在此代码中

    strcpy(name, name2);
    name[19] = '\0';

我假设名字是

    constexpr int maxNameLength = 20;
    char name[maxNameLength]; // if this is just a pointer you got other problems.

那么代码应该是

    strncpy(maxNameLength, name, name2);
    name[maxNameLength-1] = '\0';

在我开始使用std::stringstd::vectorstd::array我遇到的问题要少得多了。

在没有看到其余代码的情况下,我猜您的类正在使用指针,因此需要复制构造函数和复制赋值(以及move变体)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM