2015-06-02 64 views
0
class SMTkrSym { 
    enum { SMTKRLEN = 16 }; 
    uint8  data[SMTKRLEN]; 

public: 
    SMTkrSym() { memset(&data, 0, sizeof data); } 
    SMTkrSym(const char* pIn) { if (Read(pIn) < 0) memset(&data, 0, sizeof data); } 
    int16 Show(char* outstr) const; // display ticker symbol 
    int16 Read(const char* instr); // read ticker symbol 
    bool operator==(const SMTkrSym& rhs) const { return strncmp((char*)data, (char*)rhs.data, SMTKRLEN) == 0; } 
    bool operator!=(const SMTkrSym& rhs) const { return !(*this == rhs); } 
    bool operator>(const SMTkrSym& rhs) const { return (strncmp((char*)data, (char*)rhs.data, SMTKRLEN) > 0); } 
    bool operator<=(const SMTkrSym& rhs) const { return !(*this > rhs); } 
    bool operator<(const SMTkrSym& rhs) const { return (strncmp((char*)data, (char*)rhs.data, SMTKRLEN) < 0); } 
    bool operator>=(const SMTkrSym& rhs) const { return !(*this < rhs); } 
}; 
unsigned int SMTkrSym::Read(const char* instr) 
{ 
unsigned int i,j; 

for (i = 0; (i < SMTKRLEN) && *instr; i++) // display until null 
    data[i] = *instr++; 
for (j = i; j < SMTKRLEN; j++) 
    data[j] = '\0';  // null out rest of symbol 
return i;  // return actual number of characters 
} 

用法:分配代碼是否會導致崩潰?這個類如下面的

char pData[] = "helloworldyyyyyy"; 
char* p = pData; 
SMTkrSym key1(p); 
SMTkrSym key2; 
key2 = key1; 

的pData的長度等於16

的SMTkrSym拷貝構造將調用讀取功能和它不會把「\ 0」終止子字符當instr的長度大於或等於16.

我的問題是,當程序運行key2 = key1時,它會導致崩潰嗎?

當運行key2 = key1時,它會調用默認賦值運算符函數。

但key1的數據成員變量不包含終止符字符。

我擔心的是,如果默認分配函數使用strcpy函數來

複製數據的成員變量,它可能會導致內存過流。

我想,如果分配功能只是看起來像的memcpy(&鍵2,& KEY1, 的sizeof(KEY1)),它不會崩潰。默認分配如何工作?

+0

「如果默認賦值函數使用strcpy函數」 - 它不會,所以請不要擔心這一點,並且更擔心所有其他操作符依賴於不存在的終結符。 – WhozCraig

+0

謝謝你的回答。我的理解是,你的意思是operator =無論它是否包含結束符都是安全的複製。默認分配函數是否與編譯優化相關?默認分配函數是否會因不同的編譯優化而改變? –

回答

1

默認的編譯器提供operator=不會用strcpy()複製data[] ...會安全地memcpy所有字符複製的數組中,彷彿就像你說的,雖然它可能不是實際使用memcpy

相關問題