簡體   English   中英

奇怪的復制構造函數和析構函數錯誤

[英]Strange copy constructor and destructor error

我有一堂課,我不斷從析構函數中得到一些錯誤。 這是班級:

#pragma once
class Number
{
    int bas;
    char* val;
public:
    Number(const char* value, int base); 
    Number(const Number& x);
    ~Number();
    void SwitchBase(int newBase);
    void Print();
    int  GetDigitsCount();
    int  GetBase(); 
};

這是.cpp文件:

#include "Number.h"
#include <iostream>
Number::Number(const char* value, int base)
{
    int a = -1;
    do
    {
        a++;
    } while (value[a] != '\0');
    val = new char[a + 1];
    for (int i = 0; i <= a; i++)
        val[i] = value[i];
    bas = base;
}

Number::Number(const Number& x)
{
    int a = -1;
    bas = x.bas;
    do
    {
        a++;
    } while (x.val[a] != '\0');
    delete[]val;
    val = new char[a + 1];
    int i;
    for (i = 0; i <= a; i++)
        val[i] = x.val[i];
}
Number::~Number()
{
    delete[]val;
}
void Number::Print()
{
    std::cout << "Numarul este: " << val<< std::endl << "Baza este: " << bas<<std::endl;
}
int Number:: GetDigitsCount()
{
    int l = 0;
    do
    {
        l++;
    } while (val[l] != '\0');
    return l;
}

這是主要的:

int main()
{
    Number x("123", 10),y("111",10),z("0",10);
    z = y;
    z.Print();
}

我不斷收到此錯誤:無效地址指定給 RtlValidateHeap( 010C0000, 010C8DD8 ) 如果我在 main 中進行此更改,它可以正常工作,但它並不是我真正想要的...

int main()
{
    Number x("123", 10),y("111",10);
    Number z = y;
    z.Print();
}

我該如何解決這個問題? 我想不通...

您的Number類缺少賦值運算符。 由於您在main使用賦值運算符,因此當您退出main時,默認賦值運算符將導致雙重刪除,這解釋了錯誤。

它還解釋了當您將 main 更改為使用復制構造函數而不是賦值運算符時錯誤消失的原因。

您應該查看復制和交換習語,以展示如何輕松有效地實現復制構造函數和賦值運算符。

或者,您也可以使用std::string而不是手動分配內存。 這將消除編寫析構函數、復制構造函數和賦值運算符的需要。 這是最好的解決辦法。

這是一個使用 std::string 的代碼示例:

#include <iostream>
#include <string>

class Number
{
    int bas;
    std::string val;
public:
    Number(std::string, int base); 
    Number(const Number& number);
    Number& operator= (const Number& number);
    ~Number()=default;
    void Print();
    int  GetDigitsCount();
};


Number::Number(std::string value, int base)
{
    val=value;
    bas=base;
}

Number::Number(const Number& number)
{
    val=number.val;
    bas=number.bas;
}

Number& Number::operator= (const Number& number)
{
    val=number.val;
    bas=number.bas;
    return *this;
}

void Number::Print()
{
    std::cout << "Numarul este: " << val<< std::endl << "Baza este: " << bas<<std::endl;
}
int Number:: GetDigitsCount()
{
    return val.size();
}

int main()
{
    Number x("123", 10),y("111",10),z("0",10);
    Number k(y);
    k.Print();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM