我创建了一个包含像素强度值数组的类。复制此类时,我收到一个错误,就好像我正在尝试删除未分配的数组。因为我很确定我没有在类的创建和复制之间设置指针的指向地址,所以指针的地址与NULL之间的区别是如此神秘。如何检查空尖的地址?
for ii: some_array
index=-5:5; %I assume you fill this differently
index(index<1 || index>size(A,1))=[] % delete out of bounds
sum(A(index))
end
不起作用。
课程:
data_ == reinterpret_cast<const unsigned char *>("")
问题:
答案 0 :(得分:4)
在复制构造函数中,成员变量尚未初始化,htmltext = urllib.request.urlopen(req).read().decode('utf-8')
没有任何内容。
相反,成员变量delete[]
将具有不确定值,并且它看似随机且很可能不等于空指针,这意味着您将 undefined行为
最简单的解决方案?不要data_
使用未初始化的指针。
复制构造函数就像任何其他构造函数一样,在创建实例时调用它。不会为复制构造调用其他构造函数,只调用复制构造函数。
答案 1 :(得分:3)
if (data_)
delete[] data_; // ERROR BEING THROWN HERE
数据尚未初始化,您在复制构造函数中;不会为您调用默认构造函数。
删除这两行将删除您对未初始化变量的访问权限并解决您的问题。
正如马科斯在评论中所说 - 你可以通过使用智能指针来更好地解决问题
答案 2 :(得分:2)
尝试删除空地址(非空)
的数组指针
没有这样的事情。有空指针(值0),并且指针有非空值。非空指针可以指向或不指向有效对象。也许通过&#34;空&#34;你的意思是指向的对象无效。
如何检查空的尖头地址?
无法检查指向的对象是否有效。只要您使用它,就必须确保指针始终指向有效对象。
只有2种情况可以在指针上调用delete[]
:
new[]
返回,指针先前未被删除。在每个其他情况下删除指针会导致UB。指针不符合这些要求的情况:
指针从未初始化。例如:
T* data_;
指针初始化为new[]
未返回的值。例子:
T* data_ = new T;
T* data_ = reinterpret_cast<const unsigned char *>("");
指针由new[]
返回,但之前已被删除。这被称为悬空指针。
T* data_ = new T[10];
delete[] data_;
// data_ is a danging pointer here
PixelArray(const PixelArray& other)
{
if (data_)
delete[] data_; // ERROR BEING THROWN HERE
对我来说,指针的地址与NULL
之间的区别是如此神秘
指针尚未初始化,因此未指定其值。只有在初始化或将其分配为NULL时才会为NULL。
您正在删除未初始化的指针,因此该程序具有未定义的行为。
PS。检查data_
是否为空是多余的,因为删除空指针是安全的。
直接问题的原因:不要尝试删除未初始化的指针 - 删除复制构造函数的前两行。解决其他问题:使用std::vector
。这将修复您的错误并大大简化代码。
[我不使用
std::vector
]因为在代码的其他部分,我使用四个指针遍历数组,在循环的每个循环中将其指向的地址加1。
std::vector
并不妨碍您这样做。
但我想如果它没有降低性能,可以用矢量迭代器完成(在这种情况下性能很重要)。
也可以使用迭代器来完成,而且我知道没有技术上的理由说明为什么它们的性能会低于指针。
答案 3 :(得分:0)
您不必在复制构造函数中删除[] data_,因为还没有分配data_。
我认为你想用delete []数据实现的目标应该在赋值运算符函数中完成。
PointerArray& operator=(const PointerArray& other) {
if (data_){delete[] data_;}
//allocate data_ and copy the contents from other.data_
//rest of the assignment code here
}