分配代码会导致崩溃吗?

时间:2015-06-02 06:42:38

标签: c++ memory variable-assignment

<%= options_from_collection_for_select(Product.all, :id, :category_name) %>

此课程的用法如下:

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
}

pData的长度等于16.

SMTkrSym复制构造函数将调用read函数,它不会放置&#39; \ 0&#39;当instr的长度大于或等于16时的终止符。

我的问题是当程序运行key2 = key1并且会导致崩溃吗?

当运行key2 = key1时,它将调用默认赋值运算符函数。

但是key1的数据成员变量不包含终结符。

我担心的是,如果默认赋值函数使用strcpy函数

复制数据成员变量,它可能导致内存溢出。

我认为如果赋值函数看起来像memcpy(&amp; key2,&amp; key1, sizeof(key1)),它不会崩溃。默认分配如何工作?

1 个答案:

答案 0 :(得分:1)

默认编译器提供的operator=不会使用strcpy()复制data[] ...它会安全地复制数组中的所有字符,就像memcpy一样如你所说,虽然实际上可能没有使用memcpy