C++:运算符新的默认构造函数

C++ : operator new and default constructor

本文关键字:默认 构造函数 运算符 C++      更新时间:2023-10-16

我很难理解如何对构造函数使用动态分配。

我在代码中使用了一个名为graph的类(它只是一个表示节点之间边的布尔二维矩阵),带有以下构造函数/析构函数(还有其他方法,但我认为它与此无关):

class graph{
private:
bool** edges;
int size;
public:
graph(int size = 0):size(size){
edges = new bool*[size];
for (int i = 0; i < size; i++){
edges[i] = new bool[size];
}
}
~graph(){
for(int i = 0; i < size; ++i) {
delete [] edges[i];
}
delete [] edges;
}
//others methods
};

在我的主要,我想使用动态分配:

int main()
{
int size;
cout << "Enter graph size :" << endl;
cin >> size;
graph g1 = new graph(size);
//some processing code
return 0;
}

然而,我在实例化时遇到了一个错误(即新图形(大小)):

从"graph*"到"int"的转换无效[-fpermission]

我真的不明白哪里出了问题,我很确定这是我在其他地方看到的语法。

事实上,我真的不明白在创建对象时内存分配是如何工作的。

在这里,我在构造函数中使用new来创建bool2d矩阵,所以它将被放入堆中,不是吗?但是,如果我使用以下静态指令来实例化对象:图g1(constrongize);

那么它不应该去堆栈?

提前感谢您的回答。

编辑

最后一个问题:

图*g1=新图(大小);

正在堆栈上存储g1(指针),但对象是在堆上创建的。

图g1(大小);

正在堆栈上创建对象,g1是对它的引用

但在任何情况下,矩阵边都会在堆上?或者在第二种情况下,它会以某种方式在堆栈上结束?

错误在这里:

graph g1 = new graph(size);

这应该是:

graph *g1 = new graph(size);

原因如下:

new graph(size)

正在创建新的graph对象,并返回指向该对象的指针(使用graph*类型),并且:

graph g1 = ... 

正在尝试将其转换为int的对象(以便调用graph(int)构造函数),因此错误为invalid conversion from 'graph*' to 'int'

现在,我想这是一种练习,因为在本例中不应该在堆上使用分配。但如果你无论如何都使用它,永远不要忘记:

delete g1;

实际上,我真的不知道内存分配是如何与对象的创建一起工作的。

graph *g1 = new graph(size);

正在堆栈上存储g1(指针),但对象是在堆上创建的。

graph g1(size);

正在堆栈上创建对象,而g1是对它的引用

p.S.避免这种情况:

graph g1 = graph(const_size);

这将首先创建语句的右侧求值,并将临时graph对象,然后使用复制构造函数初始化g1

但是,例如,如果我想要一个能够处理各种图形大小的程序,而不需要每次使用不同大小的图形时都重新编译它,我会需要这样的东西,不是吗?

不,您可以为此使用堆栈分配(我刚刚注意到,在您的示例中,您对堆栈上分配的对象的构造函数使用constrongize-参数,而不需要是常量):

int size;
std::cout << "Enter size: ";
std::cin >> size;
graph g1(size);

是的,这里不需要动态分配,我只是自己练习了一下代码。但如果我想在不重新编译的情况下处理各种大小的图,这将是必要的,不是吗?

不,看看上面的例子-堆栈分配的对象大小可变-而不重新编译。

我以为我们不应该自己调用析构函数,而且当我们超出范围时,它无论如何都会被调用?(我甚至读到,在某些情况下称之为实际上很糟糕,因为它可能是第二次这样称呼它)

在堆栈分配对象的情况下也是如此-析构函数将在作用域的末尾调用。但是,如果在堆上分配对象,则在调用delete之前不会调用析构函数。

但在任何情况下,矩阵边都会在堆上?

edges = new bool*[size];
for (int i = 0; i < size; i++){
edges[i] = new bool[size];
}

是的,整个矩阵都是在堆上分配的。