运行时检查失败 #2 - 变量“l1”周围的堆栈已损坏
Posted
技术标签:
【中文标题】运行时检查失败 #2 - 变量“l1”周围的堆栈已损坏【英文标题】:Run-Time Check Failure #2 - Stack around the variable 'l1' was corrupted 【发布时间】:2017-08-25 15:39:31 【问题描述】:我目前正在测试创建一个简单的类,它将一个数字设置为一个私有变量,遵循此链接中解构函数的最后一个教程:
https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm
但是,我遇到了这个特殊的问题,它说我的变量已损坏。
。
此错误仅发生在 Training.cpp 末尾,即到达最后一个大括号时。
在这里,我在标题旁边定义了 Line.cpp 类。
//Line.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Line
public:
void setLength(double len);
double getLength(void);
Line();
private:
double length;
;
Line::Line(void)
cout << "Object is being created." << endl;
void Line::setLength(double len)
length = len;
double Line::getLength(void)
return length;
// Line.h
#pragma once
#ifndef LINE_H
#define LINE_H
class Line
public:
Line();
void setLength(double len);
double getLength(void);
;
#endif LINE_H
Training.cpp 调用调用 Line 类的 main 函数
// Training.cpp
#include "stdafx.h"
#include <string>
#include <iostream>
#include "Line.h"
using namespace std;
int main()
Line l1;
l1.setLength(10.0);
cout << "Length of line: " << l1.getLength() << endl;
return 0;
本教程和我的版本唯一的区别是我提取了 Line 类并将其放在一个名为 Line 的类文件中,该文件由 Tranining 调用,其中包含 main 函数。
我已广泛搜索此错误的其他版本,但其中大部分都提到它似乎是某种形式超出了数组边界。但是,我没有分配任何形式的 char 数组,并且完全不知道为什么会发生错误。有人能帮我解决这个问题吗?
谢谢!
【问题讨论】:
@François Andrieux,感谢格式化帮助。由于格式问题,*** 没有发布我的帖子,所以我试图发布它并在之后进行编辑。 似乎Line.cpp
和Line.h
包含两个不同的类Line
声明。这是违反 ODR 的行为 - 未定义的行为。
我很惊讶这个东西实际上可以编译。无论如何,从.cpp
文件中删除class line ...
定义并将其移动到.h
文件中,您不需要两个,保留.cpp 文件中的一个。
未发现错误。尝试重建应用程序。
根据@federico 更正您的代码,然后重试
【参考方案1】:
您定义了两次 Line 类。 一次在 Line.h 中,另一次在 Line.cpp 中。 它们也不同(在 Line.h 中它没有成员双倍长度;)
你的 Line 文件应该是这样的:
//Line.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
Line::Line(void)
cout << "Object is being created." << endl;
void Line::setLength(double len)
length = len;
double Line::getLength(void)
return length;
// Line.h
#pragma once
#ifndef LINE_H
#define LINE_H
class Line
public:
Line();
void setLength(double len);
double getLength(void);
private:
double length;
;
#endif LINE_H
【讨论】:
这成功了!只是 Line.cpp 必须为 Line.h 添加包含语句。谢谢大家!【参考方案2】:按照 Federico 的回答,错误消失了。感谢您的耐心等待!
只需将头文件添加到 Line.cpp 中即可。
【讨论】:
以上是关于运行时检查失败 #2 - 变量“l1”周围的堆栈已损坏的主要内容,如果未能解决你的问题,请参考以下文章
c++ 运行时检查失败 #2 - 变量“ToSend22”周围的堆栈已损坏