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)),它不會崩潰。默認分配如何工作?
「如果默認賦值函數使用strcpy函數」 - 它不會,所以請不要擔心這一點,並且更擔心所有其他操作符依賴於不存在的終結符。 – WhozCraig
謝謝你的回答。我的理解是,你的意思是operator =無論它是否包含結束符都是安全的複製。默認分配函數是否與編譯優化相關?默認分配函數是否會因不同的編譯優化而改變? –