【发布时间】:2013-04-19 08:05:31
【问题描述】:
粗略地说,我有一个包含 const unsigned char 数组的类。 此类的对象由一个特殊的工厂函数创建,该函数还负责构造数组(在堆上)。当在工厂函数中创建一个对象时,它将被赋予指向数组的指针。数组不会被复制,对象只会使用给定的指针。销毁时,它将释放数组占用的内存块。
class Foo
{
private:
const unsigned char* array;
size_t size;
public:
Foo(const unsigned char* array, size_t size) : array(array), size(size) {}
~Foo() {delete [] array;}
};
Foo* factoryFunction(const void* data, size_t size)
{
unsigned char* array = new unsigned char[size];
memcpy(array, data, size);
return new Foo(array, size);
}
现在想知道有没有副作用,因为new []返回unsigned char *,但是delete []被调用为const unsigned char *。不过我没有遇到任何分段错误。
【问题讨论】:
-
const关键字只是告诉编译器和读取代码的人,您不应更改此成员/变量/参数。 (使用指针,const的位置告诉内容是否不会改变,或者指针不应该改变,或两者兼而有之),但对于delete[],如果 const 存在与否,它不应该有所不同.在 c++ 中,您应该避免使用这种数组,而是使用std::vector<unsigned char>。 -
On destruction, it will reallocate the chunk of memory that the array occupied.在我看来不是这样。另外,你的复制构造函数在哪里?为什么要使用原始指针? -
@t.niese - 你提出了几个好观点,这几乎应该是一个答案而不是评论。
-
@LightnessRacesinOrbit - 感谢您的评论。我不是母语者,当然这个词应该是“deallocate”而不是“reallocate”,我会解决这个问题;)另外,我想保持代码示例简单,所以我省略了复制构造函数。我使用数组而不是 std::vector,因为我使用的是 C 库。
-
您不能依靠分段错误来识别未定义的行为。
标签: c++