【发布时间】:2013-05-15 06:41:11
【问题描述】:
我正在 C++ 中创建一个自初始化数组类,我想知道如果用户尝试分配超过 0x7fffffff 字节,我将如何抛出错误而不是异常。
类似于<array>,其中:
错误 C2148:数组的总大小不得超过 0x7fffffff 字节
这是我正在测试的构造函数之一的代码:
template<typename T>
Array<T>::Array(const size_t _SIZE) : _SIZE(_SIZE), _content(nullptr){
#define __SIZE__ _SIZE
#if (__SIZE__ > 0x7fffffff)
#error Total size of Array must not exceed 0x7fffffff bytes.
#endif
_content = new T[_SIZE];
memset(_content, 0, (sizeof(_content) * _SIZE));
}
我创建数组的方式如下:
Array<int> foo(-1) //-1 of size_t = ((2^31)*2)-1 error should be shown since ((2^31)*2)-1 > ((2^31)*2)-1
size_t 的最大大小是 ((2^31)*2)-1 和 0x7fffffff 是 (231)-1 现在问题是
错误未执行 我以前从未使用过 #if 宏,我需要让它工作...
任何帮助将不胜感激。
【问题讨论】:
-
我认为 memset 行应该是这样的:memset(_content, 0, (sizeof(T) * _SIZE));
-
不要使用带有双下划线或以下划线后跟大写字母的标识符。这些是为实现保留的(除了看起来很丑),即使在编译之前使用。
-
@user1764961 或
sizeof(*_content)。但是T不是原始类型,那么memset根本不应该使用,因为它会对对象数据造成不良影响,如果类具有虚函数,包括虚表。 -
顺便说一句,你的班级与例如
std::vector? constructing astd::vector时可以同时设置大小和初始数据。
标签: c++ macros c-preprocessor compiler-directives