运行时检查失败 #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.cppLine.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”周围的堆栈已损坏

运行时检查失败 #2 - 变量周围的堆栈已损坏

运行时检查失败 #2 - 变量“primes”周围的堆栈已损坏

运行时检查失败 #2 - 变量“索引”周围的堆栈已损坏

运行时检查失败 #2 - 变量“cid1”周围的堆栈已损坏

运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏