c++ - c++ vs调试错误crt检测到应用程序在堆缓冲区结束后写入内存
问题描述
我想
array
为Autoturism创建一个类,输入一些值并显示数组。VS 给了我一个调试错误(标题中的名称)。此代码适用于 VS 代码,但在 VS 上,我使用了类的头文件。PS。我编辑了代码,因为我试图应用 Rule-of-3来修复它,但它给了我同样的调试错误。这是一个家庭作业,我必须使用
char*
变量,还有一个array
for Autoturism。Autoturism(const char* s, unsigned int an, std::size_t n)
另外,如果有人可以解释为什么in以及( ) 有private
什么作用,我将不胜感激。谢谢 !!*accessor
operator const char* () const { return culoare; }
#include<iostream>
#include<string>
#include<cstring>
#include<cstddef>
class Autoturism
{
static int nr_autoturisme; // nr_autoturisme 'active'
char* culoare; //raw pointer
unsigned int an_fabricatie;
Autoturism(const char* s, unsigned int an, std::size_t n) // to avoid counting twice ???
:culoare(new char[n]), an_fabricatie(an) // alocate
{
std::memcpy(culoare, s, n); // populate
}
public:
Autoturism(const char* = "", unsigned int = 0);
~Autoturism();
Autoturism(const Autoturism&);
Autoturism& operator = (const Autoturism& other);
operator const char* () const { return culoare; } // accessor ???
static int return_nr_auto();
void citire();
void afisare() const;
void schimb_culoare();
void comparare_an_fab(const Autoturism);
void citire_array(size_t&);
void afisare_array(size_t);
void afisare_auto_nou(size_t);
};
int Autoturism::nr_autoturisme{ 0 };
Autoturism::Autoturism(const char* c, unsigned int an)
: Autoturism(c, an, std::strlen(c) + 1)
{
++nr_autoturisme;
std::cout << "\nConstructorul a fost apelat !";
}
Autoturism::~Autoturism()
{
std::cout << "\nDestructorul a fost apelat !";
delete [] culoare;
--nr_autoturisme;
}
Autoturism::Autoturism(const Autoturism& copy)
:Autoturism(copy.culoare, copy.an_fabricatie)
{
++nr_autoturisme; // adaugat si la copiere pt ca oricum va se apela destruct, dar nu se mai scade din cele 'active'
std::cout << "\nConstructorul copy a fost apelat !";
}
Autoturism& Autoturism::operator = (const Autoturism& other)
{
if (this == &other) return *this;
std::size_t n{ std::strlen(other.culoare) + 1 };
char* new_culoare = new char[n];
std::memcpy(new_culoare, other.culoare, n);
delete[] culoare; // ???
culoare = new_culoare;
std::cout << "\nCopy Assignment a fost folosit !";
return *this;
}
int Autoturism::return_nr_auto()
{
return nr_autoturisme;
}
void afisare_nr_auto()
{
std::cout << "\nNr de auto 'active' este : " << Autoturism::return_nr_auto();
}
void Autoturism::citire()
{
std::cout << "\n\tCuloare: ";
std::cin >> culoare;
std::cout << "\n\tAn fabricare: ";
std::cin >> an_fabricatie;
}
void Autoturism::afisare() const
{
std::cout << std::endl;
std::cout << culoare << " " << an_fabricatie;
}
void Autoturism::schimb_culoare()
{
char* ch{ nullptr };
ch = new char[10];
std::cout << "\nCuloarea pe care vreti sa o adaugati : ";
std::cin >> ch;
this->culoare = new char[strlen(ch) + 1];
this->culoare = ch;
}
void Autoturism::comparare_an_fab(const Autoturism a)
{
this->an_fabricatie > a.an_fabricatie ? std::cout << "\nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mare decat obiectului de comparat !" : std::cout << "\nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mic decat obiectului de comparat !";
}
void Autoturism::citire_array(size_t &n)
{
std::cout << "\nCitire nr de obc de tip Autoturim: ";
std::cin >> n;
for (size_t i{ 0 }; i < n; ++i)
this[i].citire();
}
void Autoturism::afisare_array(size_t n)
{
for (size_t i{ 0 }; i < n; ++i)
this[i].afisare();
}
void Autoturism::afisare_auto_nou(size_t n)
{
std::cout << "\nCel main nou autoturism este: ";
this[n - 1].afisare();
}
int main()
{
Autoturism a[10];
size_t n{0};
a->citire_array(n);
a->afisare_array(n);
return 0;
}
解决方案
推荐阅读
- json - 为什么 NG-REPEAT 不适用于服务中的 json 变量?
- macos - 当路径点从 0 更改为 1.4e-14 时,文本位置不同
- drools - Optaplanner Execution Server 员工排班示例:最佳解决方案中未填写时隙
- c# - 日期排序优化
- php - 使用 php 和谷歌库提交表单后在谷歌电子表格上写
- javascript - 如何在 jquery 中实现鼠标悬停效果?
- neo4j - 使用 H2O 无人驾驶 AI 进行欺诈环检测 - 需要样本、指针
- c# - 从 Windows 窗体文本框中获取 Unicode 数字文本
- javascript - 服务在 Sweetalert 中不起作用
- typescript - 解读 Typescript 地图功能