小编Cri*_*iss的帖子

用new []分配n个字节并用任何类型填充它?

我想动态分配已知大小的内存(只是内存,不打扰类型),并用完全相同数量的数据填充它,但任何类型(我只确定它将是原始类型).以后我会释放它.

好吗?:

auto dest = new int8_t[n];
std::memcpy(dest, src, n);
delete[] dest;
Run Code Online (Sandbox Code Playgroud)

src是ptr到一个大小的数组n(字节).我选择int8_t这是因为它是分配一定数量内存的最清晰方式.事实上,上面的代码并不是exaclt它将是什么.delete[]将在实际指向的类型的指针上调用.所以例如,如果src是一个浮点数组(忘记上面代码的最后一行):

float * ptr = dest;
delete[] ptr;
Run Code Online (Sandbox Code Playgroud)

再说一遍.会没事吗?

c++ memory

9
推荐指数
2
解决办法
2640
查看次数

从函数返回的对象的延长生命周期

关于从函数返回并绑定到rvalue/const左值引用的对象的生命周期的延长,我有一些不清楚的信息.来自这里的信息.

不会扩展对return语句中函数的返回值的临时绑定:它会在返回表达式的末尾立即销毁.这样的函数总是返回一个悬空引用.

如果我理解正确,引用声称返回语句返回的对象的生命周期是不可扩展的.但最后一句话表明,它只适用于返回引用的函数.
在海湾合作委员会,从下面的代码我得到以下输出:

struct Test
{
  Test() { std::cout << "creation\n"; }
  ~Test() { std::cout << "destruction\n"; }
};

Test f()
{
    return Test{};   
}

int main()
{
    std::cout << "before f call\n";
    Test && t = f();
    std::cout << "after f call\n";
}
Run Code Online (Sandbox Code Playgroud)
before f call
creation
after f call
destruction
Run Code Online (Sandbox Code Playgroud)

所以看起来生命延长了.
是否应延长与此类参考相关的临时对象的生命周期?您还可以提供更明确的信息来源吗?

c++ reference temporary lifetime language-lawyer

7
推荐指数
1
解决办法
1206
查看次数

VAO和GL_ELEMENT_ARRAY_BUFFER关联

我在理解VAO和绑定到的缓冲区之间的关联时遇到了问题GL_ELEMENT_ARRAY_BUFFER(我们称其为EBO)。我知道它是VAO状态的一部分,但与glVertexAttribPointer调用一起使用的缓冲区有所不同(那些缓冲区只是被VAO记住,因为属性存储不需要绑定它们-如果我理解正确的话)。
讨论中,它要求:

与GL_ARRAY_BUFFER不同,VAO存储GL_ELEMENT_ARRAY_BUFFER的当前绑定。调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)将对指定缓冲区的引用存储在当前绑定的VAO中。glDrawElements()等从当前绑定的VAO中存储的缓冲区中获取顶点索引。因此,在VAO之间切换会在元素数组之间切换。

但是我是否需要glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)在VAO的绑定和解除绑定之间进行调用以确保它会“保存”在其状态中,或者在创建VAO时VAO只会获取当前绑定的EBO?
同样,上面引述的答案对我来说也不清楚,即VAO是否只是“知道”(作为属性存储缓冲区)glDrawElements必须从哪个缓冲区索引()中获取,还是当VAO绑定时VAO绑定了正确的EBO?

编辑:我的第一个问题已在此处回答,但是我相信第二个问题已由@ Rabbid76回答。

language-agnostic opengl

5
推荐指数
1
解决办法
1730
查看次数

函数重载优先级(引用)

void func(const int &) { std::cout << "c lv ref\n"; }
void func(int &&) { std::cout << "rv ref\n"; }

func(1);
Run Code Online (Sandbox Code Playgroud)

由于const lvalue引用能够接受每种数据(const和非lval,const和非rvalue),我想知道上面的代码将打印"rv ref"的保证是什么.它是标准的还是编译器依赖的?

c++ overloading reference rvalue-reference language-lawyer

4
推荐指数
1
解决办法
138
查看次数

不合理地删除了移动构造函数

我有一个名为explicitely删除的复制构造函数的类,比方说,NonCopyable.然后是一个类型Base1成员的类NonCopyable.而另一类Base2Base1父.最后 - Derivative父母是一个阶级Base2.

由于NonCopyable是不可复制的,因此很明显Base1,Base2并且Derivative也是不可复制的.但似乎还有移动构造函数(和赋值运算符)已删除.

在这里测试一下:

以下行给出了这些错误:
Derived d1, d2 = std::move(d1);

GCC: 'Derived :: Derived(Derived &&)'被隐式删除,因为默认定义是不正确的:class Derived:
其余的错误只是声称Base1Base2复制ctors被隐式删除,这并不奇怪

MSVC:错误C2280:'Derived :: Derived(const Derived&)':尝试引用已删除的函数

在提供的链接中,还有注释行,它们给出了类似的错误.请取消注释以查看我想向您展示的更多错误(例如,未remove_if注释它会抱怨删除移动(在GCC上) /复制(在MSVC上)分配操作员).
我想要实现的是使Derivative(及其基础)可移动,但不可复制.

我正在使用Visual Studio 2015并获得与我提供的msvc链接完全相同的错误,但我不确定在rextester.com上使用什么版本的MSVC进行编译.

我也是应@Richard Critten的要求粘贴代码的:

    class NonCopyable
    {
    public:
       NonCopyable() { }
       NonCopyable(const NonCopyable &) = delete;
       NonCopyable & operator=(const …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance move-semantics c++11

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

模板与常规功能模糊 - UB?

template<typename T> T f(T i) { return i+1; }
int f(int i) { return i-1; }

f(2);
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为(请注意,这int f(int)不是专业化)?如果是,那么请指出标准载有这种情况的地方.

c++

-1
推荐指数
2
解决办法
52
查看次数