c vs ошибка отладки crt обнаружил, что приложение записало в память после окончания буфера кучи

#c #oop #visual-studio-debugging

Вопрос:

Я хочу создать array класс для автотуризма, ввести некоторые значения и отобразить массив. VS выдает мне ошибку отладки (имя в заголовке). Этот код работает с кодом VS, но в VS я работал с файлами заголовков для класса.

пс. Я отредактировал код, потому что пытался исправить его, применив Правило 3, но это дает мне ту же ошибку отладки. Это домашнее задание, и я должен использовать char* переменные, а также array для автотуризма. Также я буду признателен , если кто-нибудь сможет объяснить мне, почему существует Autoturism(const char* s, unsigned int an, std::size_t n) in private и что делает accessor ( operator const char* () const { return culoare; } ). Тх !!*

 #includelt;iostreamgt;  #includelt;stringgt;  #includelt;cstringgt;  #includelt;cstddefgt;    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 Autoturismamp;);  Autoturismamp; operator = (const Autoturismamp; 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_tamp;);  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 lt;lt; "nConstructorul a fost apelat !"; }  Autoturism::~Autoturism() {  std::cout lt;lt; "nDestructorul a fost apelat !";  delete [] culoare;  --nr_autoturisme; }  Autoturism::Autoturism(const Autoturismamp; 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 lt;lt; "nConstructorul copy a fost apelat !"; }  Autoturismamp; Autoturism::operator = (const Autoturismamp; other) {  if (this == amp;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 lt;lt; "nCopy Assignment a fost folosit !";  return *this; }  int Autoturism::return_nr_auto() {  return nr_autoturisme; }  void afisare_nr_auto() {  std::cout lt;lt; "nNr de auto 'active' este : " lt;lt; Autoturism::return_nr_auto(); }  void Autoturism::citire() {  std::cout lt;lt; "ntCuloare: ";  std::cin gt;gt; culoare;   std::cout lt;lt; "ntAn fabricare: ";  std::cin gt;gt; an_fabricatie; }  void Autoturism::afisare() const {  std::cout lt;lt; std::endl;  std::cout lt;lt; culoare lt;lt; " " lt;lt; an_fabricatie; }  void Autoturism::schimb_culoare() {  char* ch{ nullptr };  ch = new char[10];   std::cout lt;lt; "nCuloarea pe care vreti sa o adaugati : ";  std::cin gt;gt; ch;   this-gt;culoare = new char[strlen(ch)   1];  this-gt;culoare = ch; }  void Autoturism::comparare_an_fab(const Autoturism a) {  this-gt;an_fabricatie gt; a.an_fabricatie ? std::cout lt;lt; "nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mare decat obiectului de comparat !" : std::cout lt;lt; "nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mic decat obiectului de comparat !"; }  void Autoturism::citire_array(size_t amp;n) {  std::cout lt;lt; "nCitire nr de obc de tip Autoturim: ";  std::cin gt;gt; n;   for (size_t i{ 0 }; i lt; n;   i)  this[i].citire();  }  void Autoturism::afisare_array(size_t n) {  for (size_t i{ 0 }; i lt; n;   i)  this[i].afisare(); }  void Autoturism::afisare_auto_nou(size_t n) {  std::cout lt;lt; "nCel main nou autoturism este: ";  this[n - 1].afisare(); }     int main()  {  Autoturism a[10];  size_t n{0};    a-gt;citire_array(n);  a-gt;afisare_array(n);    return 0;  }  

Комментарии:

1. Определите тип, который не зависит от того, является ли он элементом массива. Если вам нужна их коллекция, сделайте это за пределами класса.

2. Когда вы дойдете до citire этого , culoare элемент неинициализирован, поэтому std::cin gt;gt; culoare имеет неопределенное поведение. Кроме того, все элементы массива уничтожаются, в том числе и те, которые culoare не являются чем-то значимым.