Dinamik bellek ayırma ile ilgili bir sorunum var gibi görünüyor.C++: Sınıf nesnesi türetildiğinde dinamik belleği ayırma
Aşağıda, void name(const char* name)
yöntemini kullanarak dinamik olarak ayrılacak bir ad değişkeninin işaretçisini içeren türetilmiş bir sınıf göreceksiniz. İşlev, nesne oluşturulduğunda ürün sınıfı için bir ad belirleyen Ürün yapıcısı tarafından çalıştırılır.
namespace sict {
class Product :public Streamable {
char* name_;
public:
Product(const char* name);
virtual ~Product();
void name(const char* name);
}
Ve burada bir argüman yapıcısı ile birlikte adı işlevi kendisidir: İşte sınıfı var
void sict::Product::name(const char * name) {
int g = strlen(name);
name_ = new char[g];
strncpy(name_, name, g);
name_[g] = 0;
}
Product::~Product() {
delete [] name_;
name_ = nullptr;
}
bu kod Çıkan zaman barışçıl onu yok ardından oluşturulan nesnenin yeterince yetenekli görünüyor Bana göre Çalıştığı işlevin kapsamı. Ancak, işlev sona erdiğinde ve yıkıcı çalıştırıldığında, program delete [] name_
'da donuyor/çöküyor. Programın Visual Studio'nun derleyicisinde çalıştırılması, belirli bir hata içermiyor gibi görünüyor (programın donması dışında), ancak gcc derleyicisi bir çeşit yığın bozulması algıladı. Bunun neden olduğunu bilen var mı?
' name_ [g] = 0 bkz. Onaylamak için 'g'' strlen (isim) + 1 '' i değiştirmeyi deneyin. Bu C++ olduğundan, ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) kullanarak daha iyi durumda olacak ve sizin için bellek yönetimini ele alalım. –
[3 Kuralı] 'na uymuyorsunuz (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three). – PaulMcKenzie
Oh, bu kolay, sadece 'std :: string' kullan. Biliyorsun, C++. C. –