【发布时间】:2019-10-29 23:07:08
【问题描述】:
我正在努力学习更多 C++ 知识! 在处理了一段时间的内存分配之后,我到了一个我很难理解它的地方。
我编写了一个代码,对于一种初始化类型(某个类的对象)运行良好(不太确定,但至少没有显示任何内存违规),但它在进行类似的初始化时会崩溃。
如果有人能解释发生了什么以及如何解决这个问题,我将不胜感激。
我的想法:问题出在下面一行,因为我试图删除一组分配的对象,而在有问题的初始化中我只分配了一个对象而不是数组。
delete[] pointer; //PROBLEMATIC LINE
PS.:我不是在寻找替代解决方案(例如使用智能指针或其他)。对不起我的英语!
代码:
class class1
{
private:
unsigned int s;
double* pointer;
public:
/* Constructors */
class1() { s = 0; pointer = nullptr; }
class1(unsigned int us, double* uarray)
{
pointer = new double[us];
for (unsigned int i = 0; i < us; i++)
pointer[i] = uarray[i];
}
class1(const class1& other)
{
pointer = new double[s];
for (unsigned int i = 0; i < s; i++)
pointer[i] = other.pointer[i];
}
~class1() { if (!s && pointer != nullptr) delete[] pointer; }
public:
/* Operators Overloading */
class1& operator=(const class1& other)
{
s = other.s;
pointer = new double[s];
for (unsigned int i = 0; i < s; i++)
pointer[i] = other.pointer[i];
return *this;
}
};
class class2
{
private:
unsigned int m;
unsigned int n;
class1* pointer;
public:
/* Constructors */
class2(unsigned int un, double* uarray, bool flag = false) : n(un)
{
m = 1;
pointer = new class1(un, uarray);
if (flag) { this->function(); }
}
~class2() { if (!m && !n) delete[] pointer; }
public:
/* Public Methods */
void function()
{
class1* newpointer = new class1[n];
//**... some code (when commented show the same error)**
delete[] pointer; //**PROBLEMATIC LINE**
pointer = newpointer;
}
public:
/*Template Constructor*/
template<unsigned int m, unsigned int n>
class2(unsigned int um, unsigned int un, double(&uarray)[m][n], bool flag = false) : m(um), n(un)
{
pointer = new class1[um];
for (unsigned int i = 0; i < um; i++)
{
class1 object1(un, uarray[i]);
pointer[i] = object1;
}
if (flag) { this->function(); }
}
};
int main()
{
double test3[] = { 1, 2, 3 };
double test4[][3] = { {3, 2, 1}, {6, 5, 4}, {9, 8, 7} };
double test5[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
class2 m4(3, test3, true); //**NOT OK - VIOLATION OF MEMORY**
class2 m5(3, 3, test4, true); //**OK**
}
【问题讨论】:
-
我看到至少三个未定义行为的实例,即未初始化的变量使用(在
function(),在特定代码路径之后的析构函数之一中,以及在复制构造函数中),以及其他类似的错误.显示的代码需要废弃并从头开始重写。 -
请不要更正代码中与您的问题相关的错误。它使其他人无法遵循问题和答案。我回滚了你的编辑。
标签: c++ memory allocation access-violation