это будет, деструктор на самом деле не уничтожает созданный вами объект, он вызывается перед уничтожением объекта, если у вас нет чего-то нового в конструкторе, вам не нужно его удалять.
Я пытаюсь найти образец, чтобы доказать
при использовании строкового (с членом-указателем) объекта в качестве переменной-члена будет вызываться его деструктор, даже если мы ничего не делаем в деструкторе класса
поэтому я попытался использовать определяемую пользователем строку в качестве объекта, поэтому нам легко написать журнал в деструкторе.
он выводит:
constructor is called
constructor is called
constructor is called
operator constructor is called
destructor is called
operator constructor is called
destructor is called
virtual ~Dog()
virtual ~Animal()
destructor is called
это показывает, что когда вызывается виртуальный ~Animal(), вызывается деструктор строкового объекта в классе Animal.
мы можем изменить строковый объект на строку * (используя new в конструкторе), ничего не делая в деструкторе, и мы увидим, что деструктор строки не вызывается
#include <iostream>
#include <string.h>
using namespace std;
class String{
public:
String(const char *str = NULL);
String(const String &str);
~String();
String operator+(const String & str);
String & operator=(const String &str);
bool operator==(const String &str);
int Length();
friend ostream & operator<<(ostream &o,const String &str);
String SubStr(int start, int end);
private:
char * charArray;
};
String::String(const char *str)
{
if(str == NULL){
charArray=new char[1];
charArray[0]='\0';
}else{
charArray=new char[strlen(str)+1];
strcpy(charArray,str);
}
std::cout<< "constructor is called" << std::endl;
}
String::String(const String &str)
{
std::cout<< "constructor is called" << std::endl;
charArray = new char[strlen(str.charArray)+1];
strcpy(charArray,str.charArray);
}
String::~String()
{
std::cout<< "destructor is called" << std::endl;
delete [] charArray;
}
String String::operator+(const String &str)
{
String res;
delete [] res.charArray;
res.charArray = new char[strlen(charArray)+strlen(str.charArray)+1];
strcpy(res.charArray,charArray);
strcpy(res.charArray+strlen(charArray),str.charArray);
return res;
}
String & String::operator=(const String &str)
{
if(charArray == str.charArray)
return *this;
delete [] charArray;
charArray = new char[strlen(str.charArray)+1];
strcpy(charArray,str.charArray);
std::cout<< "operator constructor is called" << std::endl;
return *this;
}
bool String::operator==(const String &str)
{
return strcmp(charArray,str.charArray) == 0;
}
int String::Length()
{
return strlen(charArray);
}
ostream & operator<<(ostream &o, const String &str)
{
o<<str.charArray;
return o;
}
String String::SubStr(int start, int end)
{
String res;
delete [] res.charArray;
res.charArray = new char[end-start+1];
for(int i=0; i+start<end; i++){
res.charArray[i]=charArray[start+i];
}
res.charArray[end-start] = '\0';
return res;
}
class Animal {
public:
Animal();
virtual ~Animal()=0;
Animal(String name, int age);
public:
int _age;
String _name;
};
Animal::~Animal(){
std::cout << "Animal::~Animal()" << std::endl;
}
Animal::Animal(String name, int age)
{
this->_name = name;
this->_age = age;
}
class Dog :public Animal
{
public:
virtual ~Dog() {
std::cout << "virtual ~Dog()" << std::endl;
};
Dog(String name, int age):Animal(name,age)
{
this->_name = name;
this->_age = age;
}
};
int main(){
Animal* p = new Dog( String("dog"),1);
delete p;
return 0;
}
person
michaeltang
schedule
05.03.2014
new
отредактировали их, но не сделали ни одногоdelete
- person Adrian Shum   schedule 05.03.2014std::vector<std::shared_ptr<Animal>>
. И никогдаuse namespace
в заголовке в глобальной области видимости. - person n. 1.8e9-where's-my-share m.   schedule 05.03.2014inline Animal::~Animal() { }
, и меня это беспокоит. - person CookiePaw   schedule 05.03.2014use namespace
..std::string
для каждой строки, все будет хорошо ?? - person CookiePaw   schedule 05.03.2014std::string
везде, ноusing std::string
тоже вариант. - person n. 1.8e9-where's-my-share m.   schedule 05.03.2014using/using namespace
в заголовках. Всегда используйте полное имя в заголовке. Это позволит избежать загрязнения пространства имен. Однако можно использоватьusing/using namespace
в файле impl. - person Adrian Shum   schedule 06.03.2014