C++-创建安全的constchar*构造函数
C++ - creating safe const char* contructor
我正在创建一个类,该类具有从const char*
初始化的构造函数,该构造函数应该使用缓冲区中提供的数据安全地构造对象,该数据应该包含字符串。我担心的是,用户可能会将此构造函数与错误的数据一起使用,例如NULL
指针或指向未分配内存的指针之类的数据。重点是,在这种情况下,我希望完成创建对象(它将处于未定义但正确的状态),而不会导致segfault,例如,如果用户向我发送了一个指向我不应该读取的数据的指针。我想把所有的输入验证发送到std::string
构造函数,所以构造函数看起来像这样:
Foo(const char *s) : Foo(std::string(s)) {}
但我的老师称这是一个"错误的想法"。那么,处理这种情况的正确方法是什么呢?
还有一件事,在这种情况下,我不能使用例外(这是我课程中家庭作业的一部分,还没有教过)。
问题是有些东西你绝对无法检查。组中最大的是指向无效内存的指针。例如:
char* blarg = new char[50];
delete blarg;
Foo(blarg);
这是另一个关于你所问问题的对话。有一些好的答案,但它们基本上说的是一样的。在处理指针输入时,无法100%确定用户在传入指针之前没有对指针执行诸如调用delete之类的愚蠢操作。
我担心的是,用户可能会将此构造函数与错误的数据一起使用,例如NULL指针或指向未分配内存的指针之类的数据。重点是,在这种情况下,我想完成创建对象(它将处于未定义但正确的状态)
无法检测指针是否有效。调用方必须负责确保它指向已分配的内存。
但是,可以检测指针是否为空。您可以检查它,如果是,则在不取消引用指针的情况下设置对象的状态。
我想将所有输入验证发送到std::string构造函数
但我的老师称之为";错误的想法";。
你的老师是对的。这不会有帮助,因为std::string
还要求并假设输入是有效的。使用无效指针构造它会导致未定义的行为。
那么,处理这种情况的正确方法是什么呢?
简单地要求调用方保证指针的有效性是正确的做法,也是你所能做的。如果你想检查null,请随时检查。
如果构造函数throw
中有错误。这就是它的作用。对象不是构造的,并且客户端(传入错误指针的客户端)被正确地告知了这一点。
如果您想检查您的类是否只接受std::string
作为参数和const char[]
,你可以写这样的东西:
class Foo {
public:
template<typename U>
Foo(U &&val, typename std::enable_if<std::is_same<typename std::remove_reference<U>::type, std::string>::value ||
std::is_array<typename std::remove_reference<decltype(val)>::type>::value, void>::type* = nullptr): field_(val) {}
private:
std::string field_;
};
然后:
Foo foo("aa");//accept
std::string str("bb");
Foo foo2(str);//accept
Foo fnull(NULL);//compile time error
当然,如果您只想将指针传递给char
,则此解决方案不起作用。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++-创建安全的constchar*构造函数