C++ 如何在1>仅堆栈上而不在堆上和2>仅堆而不在堆栈上创建对象
仅在堆上创建对象-> 1> 代码中有什么错误吗C++ 如何在1>仅堆栈上而不在堆上和2>仅堆而不在堆栈上创建对象,c++,object,C++,Object,仅在堆上创建对象-> 1> 代码中有什么错误吗 class B { ~B(){} public: void Destroy() { delete this; } }; int main() { B* b = new B(); b->Destroy(); return 0; } 为什么不能在堆栈上创建类b的对象 2> 3> 如何仅在堆栈上而不在堆上创建对象如果要仅在堆中创建对象,请将析构函数设置为私有。一旦析构函数私有化,代码将在堆栈上创建对象时给出编
class B
{
~B(){}
public:
void Destroy()
{
delete this;
}
};
int main() {
B* b = new B();
b->Destroy();
return 0;
}
为什么不能在堆栈上创建类b的对象
2>
3> 如何仅在堆栈上而不在堆上创建对象如果要仅在堆中创建对象,请将析构函数设置为私有。一旦析构函数私有化,代码将在堆栈上创建对象时给出编译器错误。如果不使用新对象,将在堆栈上创建对象 1仅在堆上创建对象
class B
{
~B(){}
public:
void Destroy()
{
delete this;
}
};
int main() {
B* b = new B();
b->Destroy();
return 0;
}
上面的代码似乎没有什么问题,如果您尝试在堆栈b1上创建对象,它将给出编译器错误
2为了限制堆上的对象创建,将操作符new设为private
class B
{
Private:
void *operator new(size_t);
void *operator new[](size_t);
};
int main() {
B b1; // OK
B* b1 = new B() ; // Will give error.
return 0;
}
你的代码
class B
{
B(){}
public:
static B* Create()
{
return new B();
}
};
int main() {
//B S;
B* b = B::Create();
return 0;
}
这段代码仍然在堆/空闲存储上创建对象,因为它正在使用new
3要仅在堆栈上而不是在堆上创建对象,应限制使用new运算符。这可以通过使运营商成为新的私有运营商来实现
class B
{
Private:
void *operator new(size_t);
void *operator new[](size_t);
};
int main() {
B b1; // OK
B* b1 = new B() ; // Will give error.
return 0;
}
若您只想在堆中创建对象,那个么将析构函数设置为私有。一旦析构函数私有化,代码将在堆栈上创建对象时给出编译器错误。如果不使用新对象,将在堆栈上创建对象 1仅在堆上创建对象
class B
{
~B(){}
public:
void Destroy()
{
delete this;
}
};
int main() {
B* b = new B();
b->Destroy();
return 0;
}
上面的代码似乎没有什么问题,如果您尝试在堆栈b1上创建对象,它将给出编译器错误
2为了限制堆上的对象创建,将操作符new设为private
class B
{
Private:
void *operator new(size_t);
void *operator new[](size_t);
};
int main() {
B b1; // OK
B* b1 = new B() ; // Will give error.
return 0;
}
你的代码
class B
{
B(){}
public:
static B* Create()
{
return new B();
}
};
int main() {
//B S;
B* b = B::Create();
return 0;
}
这段代码仍然在堆/空闲存储上创建对象,因为它正在使用new
3要仅在堆栈上而不是在堆上创建对象,应限制使用new运算符。这可以通过使运营商成为新的私有运营商来实现
class B
{
Private:
void *operator new(size_t);
void *operator new[](size_t);
};
int main() {
B b1; // OK
B* b1 = new B() ; // Will give error.
return 0;
}
查看:通过允许或不允许使用空闲存储堆进行动态分配来控制对象的范围和生存期查看:通过允许或不允许使用空闲存储堆进行动态分配来控制对象的范围和生存期您提到的在堆栈上创建。你打算这么做吗?有点像B;也许?要强制仅在堆上创建对象,请将析构函数设为私有。因此,如果用户在堆栈上声明对象,编译器将无法在堆栈展开期间访问析构函数,从而导致编译时错误。若要强制仅在堆栈上创建对象,请将运算符设为类的新私有运算符,这样用户将无法使用新运算符创建对象。我想知道为什么要限制对象的创建位置?我觉得这是客户的决定,而不是类本身应该关心的。这个用例是什么?@jens对于用例,单例仅作为堆实现。@qqqq好吧,单例是一种我强烈反对的反模式。对于C++,创建单体的最好方法是在单体方法中作为本地静态变量,而不是堆。还有,为什么要在堆或堆栈上创建类呢?您提到了在堆栈上创建。你打算这么做吗?有点像B;也许?要强制仅在堆上创建对象,请将析构函数设为私有。因此,如果用户在堆栈上声明对象,编译器将无法在堆栈展开期间访问析构函数,从而导致编译时错误。若要强制仅在堆栈上创建对象,请将运算符设为类的新私有运算符,这样用户将无法使用新运算符创建对象。我想知道为什么要限制对象的创建位置?我觉得这是客户的决定,而不是类本身应该关心的。这个用例是什么?@jens对于用例,单例仅作为堆实现。@qqqq好吧,单例是一种我强烈反对的反模式。对于C++,创建单体的最好方法是在单体方法中作为本地静态变量,而不是堆。还有,为什么要在堆或堆栈上创建类呢?@JamesRoot如果析构函数是私有的,那么尝试在堆栈上创建对象的代码将不会编译。当对象超出范围时,编译器将无法映射对象的析构函数。是的,我们也可以将构造函数设为私有,但这将限制类之外的任何类型的对象创建。您仍然可以通过将B设为另一个类的成员,在堆上分配B。C类{B;};C=新的C;工作示例:@JamesRoot如果析构函数是私有的,则尝试在堆栈上创建对象的代码将不会编译。当对象超出范围时,编译器将无法映射对象的析构函数。是的,我们也可以将构造函数设为私有,但这将限制类之外的任何类型的对象创建。您仍然可以通过将B设为另一个类的成员,在堆上分配B。C类{B;};C=新的C;工作示例: