只是一个简单的问题.正如标题所示,我只使用"new"运算符来创建类的新实例,所以我想知道其他方法是什么以及如何正确使用它.
最近出现在我作为助教的课堂上.我们正在教学生如何用c ++编写复制构造函数,最初教过java的学生问你是否可以从另一个构建函数调用.我知道这个问题的答案是否定的,因为他们在课堂上使用了迂腐的旗帜作为他们的代码,而旧标准对此并不支持.我在Stackoverflow和其他网站上发现了使用new (this)如下伪造此内容的建议
class MyClass
{
private:
int * storedValue;
public:
MyClass(int initialValue = 0)
{
storedValue = new int(initialValue);
}
~ MyClass()
{
delete storedValue;
}
MyClass(const MyClass &b)
{
new (this) MyClass(*(b.storedValue));
}
int value() {
return *storedValue;
}
};
Run Code Online (Sandbox Code Playgroud)
这是非常简单的代码,显然不会通过重用构造函数来保存任何代码,但它仅仅是例如.
我的问题是,这是否符合标准,如果有任何边缘情况应该考虑,以防止这是声音代码?
编辑:我应该注意到这对我来说似乎是非常危险的,但是从我不太了解它不仅仅是知道如何变坏它的观点来看更多.我只是想确保如果学生被问到我可以指导他们为什么能够或不应该这样做.为了所有实际目的,我已经向他们建议使用共享初始化方法.这更像是一个教学问题,而不是一个实际项目.
我一直在尽力学习C++,但我之前的培训在一个主要问题上不足:内存管理.我的主要语言都有自动垃圾收集,所以跟踪一切从来没有真正必要.我已经尝试过在线阅读C++中的内存管理,但我对此感到怀疑,因为我遗漏了一些东西.
所以,这是一个多部分的问题:
delete在循环重新迭代之前调用任何新指针.它是否正确?你需要用引用做些什么吗?mallocfreecallocrealloc***********************更新*******************
这是为了解释在评论一中对lmgtfy的引用(由Ewan提供).如果您开始阅读那里可用的信息,则对初学者没用.我认为这是一个伟大的理论,但它对这个问题既不相关也不有用.
由于某些原因,我似乎无法将我的展示位置新工作.基于这个问题,我已经正确设置了这个问题.
但是,我继续得到错误:
'operator new':函数不带2个参数
这是我的代码:
char * p = new char [sizeof(Node) * 5];
Node* node = new(p) Node();
Run Code Online (Sandbox Code Playgroud)
其中Node是链表节点.我试图根据其他堆栈溢出问题简化此问题,我仍然得到相同的错误:
char *buf = new char[sizeof(int)]; // pre-allocated buffer
int *p = new (buf) int;
Run Code Online (Sandbox Code Playgroud)
有谁知道我为什么会遇到这个问题?
任何帮助是极大的赞赏!
PS,这个有效:
Node* node = new Node();
Run Code Online (Sandbox Code Playgroud) 考虑以下:
class A {
public:
const int c; // must not be modified!
A(int _c)
: c(_c)
{
// Nothing here
}
A(const A& copy)
: c(copy.c)
{
// Nothing here
}
};
int main(int argc, char *argv[])
{
A foo(1337);
vector<A> vec;
vec.push_back(foo); // <-- compile error!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显然,复制构造函数是不够的.我错过了什么?
编辑:Ofc.我无法在operator =()方法中更改this-> c,因此我没有看到如何使用operator =()(尽管std :: vector需要).
我正在用C++为我的VM编写一个内存管理器.好吧,更确切地说,VM指令将被编译成带有嵌入式内存管理器的C++.我在处理C方面感觉更舒服,但现在我确实需要异常处理的原生支持,这几乎是我使用C++的唯一原因.
C和C++都有严格的别名规则,两个不兼容类型的对象不应重叠,在C中对于联合有一个小的例外.但是,以限定的存储器分配功能,如行为malloc,calloc,alloca等等,C标准具有以下段落.
6.5-6访问其存储值的对象的有效类型是对象的声明类型(如果有).已分配的对象没有声明的类型.如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用
memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.
这有效地使用原始分配的内存为任何类型在C中定义良好的行为.我试图在C++标准文档中找到类似的段落,但找不到一个.我认为C++在这方面有不同的方法.什么是C语言中"没有声明类型的已分配对象"的C++等价物,C++标准如何定义它?
第二行是什么?(在回答另一个问题时看到.)
int * x = new int [1] ;
int * y = new (x) int;
Run Code Online (Sandbox Code Playgroud)
在第二行x和y之后具有相同的值(指向相同的地方).y = x和第二行之间有什么区别?它像构造函数还是什么?
例如,如果动态存储器的解除分配总是在与分配相反的方向上完成.在这种情况下,是否可以保证堆不会碎片化?
从理论的角度来看:对于一个非常重要的应用程序来说,是否存在一些管理内存以完全避免堆碎片的现实方法?(在堆中的每次原子更改之后,堆仍然是未分段的吗?)
c++ ×10
memory ×2
c ×1
c# ×1
class ×1
constructor ×1
in-place ×1
java ×1
new-operator ×1
pointers ×1
reference ×1
syntax ×1
terminology ×1
this ×1
vector ×1