首页 > 解决方案 > c++ vs调试错误crt检测到应用程序在堆缓冲区结束后写入内存

问题描述

我想arrayAutoturism创建一个类,输入一些值并显示数组。VS 给了我一个调试错误(标题中的名称)。此代码适用于 VS 代码,但在 VS 上,我使用了类的头文件。

PS。我编辑了代码,因为我试图应用 Rule-of-3来修复它,但它给了我同样的调试错误。这是一个家庭作业,我必须使用char*变量,还有一个arrayfor AutoturismAutoturism(const char* s, unsigned int an, std::size_t n)另外,如果有人可以解释为什么in以及( ) 有private什么作用,我将不胜感激。谢谢 !!*accessoroperator 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;
    }

标签: c++oopvisual-studio-debugging

解决方案


推荐阅读