[英]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 && stuff
要save = 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::string
, std::vector
和std::array
我遇到的问题要少得多了。
在没有看到其余代码的情况下,我猜您的类正在使用指针,因此需要复制构造函数和复制赋值(以及move变体)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.