没有编译错误的第一次机会异常

Posted

技术标签:

【中文标题】没有编译错误的第一次机会异常【英文标题】:First chance exception without compiling errors 【发布时间】:2015-01-06 12:48:54 【问题描述】:

我编写的代码编译时没有错误,因此我不知道发生错误的原因。

#pragma once
class Macierz

public:
class Wiersz

public:
    int *tab;
    int dlugosc;
    Wiersz(int d);
;

int x;
int y;
Wiersz *wiersze;
public:
Macierz(int m, int n);
Macierz(Macierz &m);

Macierz & operator+(Macierz &m);
Macierz & operator-(Macierz &m);
Macierz & operator*(Macierz &m);
Macierz & operator=(Macierz &m);
int& operator()(int x, int y);
string to_String();

;

#include "stdafx.h"
#include "Macierz.h"


Macierz::Macierz(int _x, int _y) :x(_x), y(_y)

Wiersz **tab = new Wiersz*[_x];
for (int i = 0; i < x; i++)
    tab[i] = new Wiersz(_y);
wiersze = *tab;



Macierz::Macierz(Macierz &m) :Macierz(m.x, m.y)

for (int i = 0; i < x; i++)
    for (int j = 0; j < y; j++)
        wiersze[i].tab[j] = m.wiersze[i].tab[j];





Macierz & Macierz::operator+(Macierz &m)

if (x != m.x || y != m.y) throw "Macierze maja rozne rozmiary";
Macierz *temp = new Macierz(m);

for (int i = 0; i < x; i++)
    for (int j = 0; j < y; j++)
        (*temp).wiersze[i].tab[j] += wiersze[i].tab[j];

return *temp;



Macierz & Macierz::operator-(Macierz &m)

if (x != m.x || y != m.y) throw "Macierze maja rozne rozmiary";
Macierz *temp = new Macierz(m);

for (int i = 0; i < x; i++)
    for (int j = 0; j < y; j++)
        (*temp).wiersze[i].tab[j] -= wiersze[i].tab[j];

return *temp;



Macierz & Macierz::operator*(Macierz &m)

Macierz *temp;
if (x == m.y)

    temp = new Macierz(m.x, y);
    for (int i = 0; i < (*temp).x; i++)
        for (int j = 0; j < (*temp).y; j++)
            for (int l = 0; l < m.y; l++)
                (*temp).wiersze[i].tab[j] += wiersze[i].tab[l] * m.wiersze[l].tab[j];


else if (y == m.x)

    temp = new Macierz(x, m.y);
    for (int i = 0; i < (*temp).x; i++)
        for (int j = 0; j < (*temp).y; j++)
            for (int l = 0; l < y; l++)
                (*temp).wiersze[i].tab[j] += wiersze[i].tab[l] * m.wiersze[l].tab[j];

else throw "Rozmiary macierzy sie nie zgadzaja";

return *temp;



Macierz & Macierz::operator=(Macierz &m)

for (int i = 0; i < x; i++)
    for (int j = 0; j < y; j++)
        wiersze[i].tab[j] = m.wiersze[i].tab[j];

return *this;



int& Macierz::operator()(int x, int y)

return wiersze[x].tab[y];



Macierz::Wiersz::Wiersz(int i)

dlugosc = i;
tab = new int[dlugosc];



string Macierz::to_String()


std::ostringstream str;
str << "|";
for (int i = 0; i < x; i++)

    for (int j = 0; j < y; j++)
        str << wiersze[j].tab[i] << ",";
    str << "\b|\n";


return str.str();

在 main 中使用构造函数不会使程序崩溃:

Macierz m1(1,1);

但是,访问某些数据字段似乎存在问题,例如

 m1(0,0) = 1; 

(至少这是一些黄色箭头指向的代码行)

程序用于矩阵(+,-,*)的运算。我以类似的方式为欧几里德向量运算编写了一个程序,效果很好。

提前感谢您的帮助。

【问题讨论】:

始终在此处显示相关 (SCCE) 代码,而不是从其他网站链接。 在调试器中运行调试构建。调试器将在崩溃的位置停止,并让您检查函数调用堆栈以及所有变量。 编辑并发布了一个简短的示例。 【参考方案1】:

你的代码中有很多问题会导致问题:

    您的构造函数Macierz(int _x, int _y) 不像您想象的那样工作。只有wiersze[0] 完成后才有效,任何非零索引都将访问未知内存。问题实际上在于您对 2D 矩阵类的设计。我会摆脱手动管理的内存,只使用 2D 矢量vector&lt;vector&lt;int&gt;&gt; 甚至只是一个平面 1D 向量并手动管理索引。 您的复制构造函数Macierz(Macierz &amp;m) 没有为新矩阵分配内存,因此您正在写入未知内存。 所有二元运算符(+、-、*)分配一个新对象并返回它,这将导致内存泄漏。规范的方法通常是修改对象,对于这样的操作符只修改 return *this;。有关运算符重载的更多详细信息,请参阅this question。 您的复制运算符Macierz::operator=(Macierz &amp;m) 不会检查矩阵是否大小相同。如果大小不同,则需要销毁并重新分配矩阵。 您的 Macierz::operator()(int x, int y) 不会检查输入索引,这可能是故意的,但您可以考虑像使用其他方法一样抛出异常。 您没有会导致内存泄漏的析构函数,但如果您使用vector&lt;&gt;,则不需要。

如果您确实需要/想要从头开始实现 2D 矩阵类,您可以在线搜索大量现有代码,例如 this one,作为示例。

【讨论】:

【参考方案2】:

由于有很多指针算法,我敢打赌这是一个内存访问问题。 无论如何,当您使用 C++ 时,您应该利用矩阵类而不是重新发明***... 例如 Basic Linear Algebra Library 和他的 matrix 类是***参考。 有了这样一个类,在调试模式下编译时,会检查内存访问并帮助您快速错误索引。

【讨论】:

希望我可以使用基本类。我需要为我的课程重新发明***。 那么看看这个类是如何构建的,并在你自己的中插入索引检查

以上是关于没有编译错误的第一次机会异常的主要内容,如果未能解决你的问题,请参考以下文章

maven异常解决:编码GBK的不可映射字符

Visual Studio 2017在首次运行时未显示编译异常

Android 编译错误记录

Android 编译错误记录

Android 编译错误记录

Android 编译错误记录