<%= 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)),它不会崩溃。默认分配如何工作?
答案 0 :(得分:1)
默认编译器提供的operator=
不会使用strcpy()
复制data[]
...它会安全地复制数组中的所有字符,就像memcpy
一样如你所说,虽然实际上可能没有使用memcpy
。