2017-04-19 94 views
-1

最近我刪除了一個對象並引發了一個異常,我已經縮小到使用strcpy()。爲了測試這個,我做了一個簡單的測試類,它基本上只使用strcpy()和瞧,這是一個例外。無法刪除使用strcpy的對象()

#pragma once 
class TestClass 
{ 
public: 
    TestClass(char []); 
    ~TestClass(); 

    char teststring[]; 
}; 

它的構造是這樣的:

TestClass::TestClass(char incstring[]) 
{ 
    strcpy(teststring, incstring); 
    printf(teststring); 
} 

如果我運行下面的代碼:

int main(){ 
    TestClass* test = new TestClass("Cheezit"); 

    delete test; 
} 

我得到一個拋出的異常!什麼是STRCPY()?!?!?!?!

注意:控制檯窗口打印「Cheezit」。

+4

這不是一個有效的類定義。你的代碼無效C++;你非常不幸的是要使用一個破碎的編譯器(或者以破碎的方式使用編譯器),它可以讓你擺脫這種困境。 –

+0

請編輯您的問題以包含[mcve] – Slava

+0

@Slava:可能是。這看起來像一個C靈活的數組成員,在C++中很奇怪。 –

回答

1
char teststring[]; 

作爲數組成員在標準C++中是不允許的。

您的編譯器似乎將它視爲C的一個功能的靈活數組成員,作爲C++的擴展。但是,正確使用靈活陣列成員需要謹慎分配,這是您尚未完成的任務。所以即使假設有這樣的擴展,你的程序仍然有未定義的行爲。

2

您的代碼無效C++。在C++中,所有非靜態類數據成員必須具有完整類型,並且char[]不是完整類型。您需要指定數組的大小,然後相應地初始化數組:

class TestClass 
{ 
public: 
    TestClass(char a[]) : teststring{} { std::strncpy(teststring, a, 2); } 
    char teststring[3]; 
}; 

不能推斷出任何構造數組的大小,因爲構造函數是類的一部分,並且類是不完整的,直到數組大小已經被指定。

+0

[Demo](https://ideone.com/XUvRca) –

+0

使用C++ 17,他可以使它成爲一個模板類,並且其大小被推斷爲:http ://en.cppreference.com/w/cpp/language/class_template_deduction –

+0

@JerryJeremiah:好的,但那是完全不同的......(你不會推導出構造函數參數*值*!) –