相关疑难解决方法(0)

什么是C++中的就地构造函数?

可能重复:
C++的"放置新"

什么是C++中的就地构造函数?

例如Datatype*x = new(y)Datatype();

c++ constructor in-place placement-new

20
推荐指数
2
解决办法
3万
查看次数

创建没有"new"运算符的类的新实例

只是一个简单的问题.正如标题所示,我只使用"new"运算符来创建类的新实例,所以我想知道其他方法是什么以及如何正确使用它.

c++ class

20
推荐指数
2
解决办法
4万
查看次数

使用new(this)重用构造函数

最近出现在我作为助教的课堂上.我们正在教学生如何用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++ this placement-new

19
推荐指数
3
解决办法
9021
查看次数

我需要了解C++中的内存?

我一直在尽力学习C++,但我之前的培训在一个主要问题上不足:内存管理.我的主要语言都有自动垃圾收集,所以跟踪一切从来没有真正必要.我已经尝试过在线阅读C++中的内存管理,但我对此感到怀疑,因为我遗漏了一些东西.

所以,这是一个多部分的问题:

  • 关于内存管理我需要了解的最低限度是什么?(或者,我在哪里找到它)?
  • 我在哪里可以获得中级和高级知识/教程/等(一旦完成基础知识)?

  • 进一步来说:
  • 指针和引用之间的性能差异是什么?
  • 我听说在循环中,你需要确保delete在循环重新迭代之前调用任何新指针.它是否正确?你需要用引用做些什么吗?
  • 什么是内存泄漏的经典例子?
  • 我需要了解以下内容(我是否真的需要使用它们 - 如果是这样,在哪里?):
    • malloc
    • free
    • calloc
    • realloc

***********************更新*******************

这是为了解释在评论一中对lmgtfy的引用(由Ewan提供).如果您开始阅读那里可用的信息,则对初学者没用.我认为这是一个伟大的理论,但它对这个问题既不相关也不有用.

c++ pointers memory-management reference

16
推荐指数
5
解决办法
1513
查看次数

'operator new':函数不带2个参数

由于某些原因,我似乎无法将我的展示位置新工作.基于这个问题,我已经正确设置了这个问题.

但是,我继续得到错误:

'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)

c++ placement-new

16
推荐指数
1
解决办法
4827
查看次数

std ::对象的向量和const-correctness

考虑以下:

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++ vector const-correctness

15
推荐指数
3
解决办法
4454
查看次数

在C中,"没有声明类型的已分配对象"的C++等价物是什么?

我正在用C++为我的VM编写一个内存管理器.好吧,更确切地说,VM指令将被编译成带有嵌入式内存管理器的C++.我在处理C方面感觉更舒服,但现在我确实需要异常处理的原生支持,这几乎是我使用C++的唯一原因.

C和C++都有严格的别名规则,两个不兼容类型的对象不应重叠,在C中对于联合有一个小的例外.但是,以限定的存储器分配功能,如行为malloc,calloc,alloca等等,C标准具有以下段落.

6.5-6访问其存储值的对象的有效类型是对象的声明类型(如果有).已分配的对象没有声明的类型.如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.

这有效地使用原始分配的内存为任何类型在C中定义良好的行为.我试图在C++标准文档中找到类似的段落,但找不到一个.我认为C++在这方面有不同的方法.什么是C语言中"没有声明类型的已分配对象"的C++等价物,C++标准如何定义它?

c c++ memory

15
推荐指数
1
解决办法
582
查看次数

这第二个新内容是什么?

第二行是什么?(在回答另一个问题时看到.)

int * x = new int [1] ;
int * y = new (x) int;
Run Code Online (Sandbox Code Playgroud)

在第二行x和y之后具有相同的值(指向相同的地方).y = x和第二行之间有什么区别?它像构造函数还是什么?

c++ syntax terminology placement-new new-operator

14
推荐指数
1
解决办法
469
查看次数

是否有可能完全避免堆碎片?

例如,如果动态存储器的解除分配总是在与分配相反的方向上完成.在这种情况下,是否可以保证堆不会碎片化?

从理论的角度来看:对于一个非常重要的应用程序来说,是否存在一些管理内存以完全避免堆碎片的现实方法?(在堆中的每次原子更改之后,堆仍然是未分段的吗?)

c++ memory-management

14
推荐指数
2
解决办法
6314
查看次数

新的总是在C++/C#/ Java中分配在堆上

无论使用C++或C#还是Java,我的理解始终是当我们使用new关键字创建对象时,它会在堆上分配内存.我认为new只需要引用类型(类),并且原始类型(int,bool,float等)永远不会使用new并且总是在堆栈上(除非它们是实例化的类的成员变量)与new).不过,我一直在阅读信息,这让我怀疑这个长期存在的假设,至少对于Java和C#.

例如,我刚注意到在C#中,new运算符可用于初始化值类型,请参见此处.这是规则的一个例外,该语言的辅助功能,如果是,那么还会有哪些其他例外?

有人可以澄清一下吗?

c# c++ java memory memory-management

13
推荐指数
3
解决办法
1万
查看次数