相关疑难解决方法(0)

C++ 11中的new keyword = default

我不明白为什么我会这样做:

struct S { 
    int a; 
    S(int aa) : a(aa) {} 
    S() = default; 
};
Run Code Online (Sandbox Code Playgroud)

为什么不说:

S() {} // instead of S() = default;
Run Code Online (Sandbox Code Playgroud)

为什么要为此引入一个新关键字?

c++ c++11

121
推荐指数
6
解决办法
5万
查看次数

Python(和Python C API):__ new__与__init__

我要问的问题似乎是Python使用__new__和__init__的重复但是无论如何,我还不清楚到底是什么__new____init__它之间的实际区别.

在你急于告诉我__new__是用于创建对象并且__init__用于初始化对象之前,让我说清楚:我明白了. 事实上,这种区别对我来说是很自然的,因为我在C++中有经验,我们有新的贴图,它同样将对象分配与初始化分开.

Python的C API教程解释它是这样的:

新成员负责创建(而不是初始化)该类型的对象.它在Python中作为__new__()方法公开.... 实现新方法的一个原因是确保实例变量的初始值.

所以,是的 - 我得到了什么__new__,但尽管如此,我仍然不明白为什么它在Python中有用.给出的示例说,__new__如果要"确保实例变量的初始值" ,这可能很有用.那么,这究竟是什么意思__init__呢?

在C API教程中,显示​​了一个示例,其中创建了一个新类型(称为"Noddy"),并__new__定义了Type的函数.Noddy类型包含一个名为的字符串成员first,并且此字符串成员初始化为空字符串,如下所示:

static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    .....

    self->first = PyString_FromString("");
    if (self->first == NULL)
    {
       Py_DECREF(self);
       return NULL;
    }

    .....
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有__new__此处定义的方法,我们必须使用PyType_GenericNew,它只是将所有实例变量成员初始化为NULL.因此,该__new__方法的唯一好处是实例变量将以空字符串开头,而不是NULL. 但是为什么这个有用,因为如果我们关心确保我们的实例变量被初始化为某个默认值,我们可以在 …

c python python-c-api

118
推荐指数
5
解决办法
3万
查看次数

如何使此C++对象不可复制?

见标题.

我有:

class Foo {
   private:
     Foo();
   public:
     static Foo* create();
}
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能让Foo无法复制?

谢谢!

c++ copy-constructor noncopyable

64
推荐指数
8
解决办法
5万
查看次数

新的和删除在C++ 14中仍然有用吗?

鉴于可用性make_uniquemake_shared自动删除unique_ptr以及shared_ptr析构函数,在C++ 14中使用new和使用的情况(除了支持遗留代码之外)是delete什么?

c++ new-operator dynamic-memory-allocation c++11 c++14

59
推荐指数
2
解决办法
3809
查看次数

使用非平凡的构造函数初始化联合

我有一个结构,我创建一个自定义构造函数来将成员初始化为0.我在较旧的编译器中看到,当处于释放模式时,如果没有将memset设置为0,则不会初始化值.

我现在想在union中使用这个结构,但是因为它有一个非平凡的构造函数而得到错误.

那么,问题1.默认编译器实现的构造函数是否保证结构的所有成员都将为null初始化?非平凡的构造函数只是将所有成员的memset设置为'0'以确保结构清晰.

问题2:如果必须在基础结构上指定构造函数,如何实现联合以包含该元素并确保0初始化的基本元素?

c++ constructor multiplatform

55
推荐指数
2
解决办法
5万
查看次数

是否可以以便携方式使用新的数组放置?

在将它用于数组时,是否可以在便携式代码中实际使用新的放置?

看来你从new []返回的指针并不总是和你传入的地址相同(5.3.4,标准中的注释12似乎证实这是正确的),但是我不知道你是怎么回事如果是这种情况,可以为数组分配一个缓冲区.

以下示例显示了该问题.使用Visual Studio编译,此示例导致内存损坏:

#include <new>
#include <stdio.h>

class A
{
    public:

    A() : data(0) {}
    virtual ~A() {}
    int data;
};

int main()
{
    const int NUMELEMENTS=20;

    char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
    A *pA = new(pBuffer) A[NUMELEMENTS];

    // With VC++, pA will be four bytes higher than pBuffer
    printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);

    // Debug runtime will assert here due to heap corruption
    delete[] pBuffer;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

查看内存,编译器似乎使用缓冲区的前四个字节来存储其中项目数的计数.这意味着因为缓冲区sizeof(A)*NUMELEMENTS很大,所以数组中的最后一个元素被写入未分配的堆中.

所以问题是你能找到你的实现需要多少额外的开销来安全地使用placement new []吗?理想情况下,我需要一种可在不同编译器之间移植的技术.请注意,至少在VC的情况下,不同类的开销似乎不同.例如,如果我删除示例中的虚拟析构函数,则new []返回的地址与我传入的地址相同.

c++ arrays compiler-construction portability overhead

36
推荐指数
2
解决办法
1万
查看次数

const成员和赋值运算符.如何避免未定义的行为?

回答了关于std :: vector of objects和const-correctness的问题,得到了不应有的 downvote和关于undefined行为的评论.我不同意,因此我有一个问题.

考虑使用const成员的类:

class A { 
public: 
    const int c; // must not be modified! 
    A(int c) : c(c) {} 
    A(const A& copy) : c(copy.c) { }     
    // No assignment operator
}; 
Run Code Online (Sandbox Code Playgroud)

我想要一个赋值运算符,但我不想const_cast在下面的代码中使用其中一个答案:

A& operator=(const A& assign) 
{ 
    *const_cast<int*> (&c)= assign.c;  // very very bad, IMHO, it is undefined behavior
    return *this; 
} 
Run Code Online (Sandbox Code Playgroud)

我的解决方案是

A& operator=(const A& right)  
{  
    if (this == &right) return *this;  
    this->~A() 
    new (this) A(right); …
Run Code Online (Sandbox Code Playgroud)

c++ const undefined-behavior assignment-operator

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

是否可以将C++智能指针与C的malloc一起使用?

我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用newtry{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.

所以我有一个问题.我可以同时使用智能指针malloc吗?

就像是:

SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)

像这样的东西.

这可能吗?

谢谢,Boda Cydo.

c++ malloc smart-pointers new-operator

23
推荐指数
2
解决办法
1万
查看次数

有没有办法在不使用new的情况下从函数返回抽象(出于性能原因)

例如,我有一些pet_maker()创建并返回a Cat或a Dog作为基础的函数Pet.我想多次调用这个函数,并对Pet返回的函数做一些事情.

传统上我newCat还是Dogpet_maker()和返回一个指向它,但是new通话比在栈上所做的一切要慢得多.

是否有一种简洁的方式,任何人都可以想到作为抽象返回,而不必每次调用函数时都做新的,或者是否有其他方法可以快速创建和返回抽象?

c++ oop

23
推荐指数
4
解决办法
2414
查看次数

逐渐构建一个对象

假设有两个类的层次结构(class Derived: public Base).这两个类都有很大的内存占用和昂贵的构造函数.请注意,这些类中没有任何内容在堆中分配:它们只是有一个大的sizeof.

然后有一个具有快速路径(始终执行)和慢速路径(有条件地执行)的功能.快速路径需要一个Base实例,慢速路径需要一个Derived从现有基础构建的实例.此外,只有在快速路径之后才能做出慢速路径决定.

当前代码如下所示:

void f()
{
    Base base;
    /* fast path */

    if (need_slow_path) {
        Derived derived (base);
        /* slow path */
    }
}
Run Code Online (Sandbox Code Playgroud)

这是低效的,因为需要将基数复制到派生中; 基数也被分配两次,存在堆栈溢出的风险.我想要的是:

  • Derived例如,分配内存
  • 打电话Base给它
  • 执行快速路径
  • 如果需要,Derived在现有Base实例上调用ctor 并执行慢速路径

在C++中有可能吗?如果没有,有哪些可行的解决方法?显然,我正在努力优化速度.

c++

21
推荐指数
3
解决办法
1310
查看次数