小编Neo*_*ana的帖子

为什么生成的gmon.out文件不包含数据?

我使用-pg开关编译了一个程序,并使用-pg开关进行链接.执行程序时,会生成一个文件"gmon.out".但是,在文件上运行gprof之后,除了解释所提供数据的标准信息之外,没有其他数据.

为什么gmon.out文件中什么都没有?当生成新的"gmon.out"文件时,程序显然已正确编译和链接; 它只是没有数据.

gprof

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

什么取代了 C++17 中的 std::codecvt_utf8 或者我如何将 int 转换为 u32 字符串?

我在cppreference.com上注意到<codecvt>C++17 中不推荐使用标题中的此内容和相关内容。

那么支持的替代方案是什么?

我正在尝试将 an 转换int为 astd::u32srting以正确支持 unicode。我打算在使用时std::to_stringstd::to_wstring之前进行转换,std::wstring_convert但注意到它已被弃用。我宁愿使用正确的最新标准。

c++17

5
推荐指数
0
解决办法
932
查看次数

当我从 std::vector 中的 new 位置调用析构函数时会发生什么?

如果我有以下

#include <vector>

class C
{
public:
    C()
    :
        m_d(new int)
    {
        *m_d = 2;
    }

    ~C()
    {
        delete m_d;
    }

    int* m_d;
};

int main()
{
    std::vector<char> data;

    data.resize(sizeof(C));

    C* newC = new(&data[0]) C;

    C* cAgain = reinterpret_cast<C*>(&data[0]);
    cAgain->~C();

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

究竟会发生什么?当std::vector<char>销毁时,它是否释放了两次内存?如果没有,为什么没有?如果有,你会如何预防?

c++ destructor vector

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

如何创建此标记联合的实例?有关已删除构造函数的编译器错误

这是我标记的联合:

struct UniformVariant
{
    enum class UNIFORM_TYPE {FLOAT, INT32, VEC2, VEC3, VEC4, MAT4} type;
    union
    {
        float f;
        int i;
        glm::vec2 v2;
        glm::vec3 v3;
        glm::vec4 v4;
        glm::mat4 m4;
    } value;
};
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样使用它:

void some_function()
{
    UniformVariant v;
    some_other_function(v);
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误 use of deleted function 'UniformVariant::UniformVariant()'

它进一步表示它被隐式删除,因为默认定义是不正确的.所以我尝试添加一个构造函数UniformVariant

UniformVariant() : value(0.0f), type(UNIFORM_TYPE::FLOAT) { };
Run Code Online (Sandbox Code Playgroud)

但类似的问题.我认为这与在联合中包含类类型有关; 但我无法弄清楚正确使用它的语法.

c++

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

为什么我没有WGL_ARB_create_context扩展名?

我正在执行以下代码来创建核心配置文件OpenGL上下文.

具体来说,我是:

  1. 创建一个虚拟窗口
  2. 使用这个虚拟窗口来请求OpenGL上下文(我假设它将是硬件加速,但我不确定这甚至是否重要)
  3. 使用此OpenGL上下文加载OpenGL函数指针
  4. 使用这些函数指针,然后我尝试使用wglCreateContextAttribsARB在第二个窗口中专门创建具有核心配置文件的第二个上下文.

码:

WNDCLASSW wcDummy = {0};
wcDummy.lpfnWndProc     = +[](HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){return DefWindowProcW(hWnd, message, wParam, lParam);};
wcDummy.hInstance       = GetModuleHandle(0);
wcDummy.hbrBackground   = (HBRUSH)(COLOR_BACKGROUND);
wcDummy.lpszClassName   = L"Dummy";
wcDummy.style           = CS_OWNDC;

if(!RegisterClassW(&wcDummy))
{
    get_and_print_error();
    return false;
}

HWND windowDummy = CreateWindowW(wcDummy.lpszClassName, title.c_str(), WS_DISABLED, 0, 0, 640, 480, 0, 0, wcDummy.hInstance, NULL);
if(windowDummy == NULL)
{
    get_and_print_error();
    return false;
}

PIXELFORMATDESCRIPTOR pfdDummy =
{
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    32, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl

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

如何将元素从C++ 11容器移动到容器的后面?

如何将元素从C++ 11容器移动到容器的后面?

我特意使用列表,但如果需要可以使用向量(或者可能是任何容器;最好获得通用容器解决方案).

我有一个元素列表.我有一个价值.我将此值传递给每个元素; 其中一人会回应.第一个响应我要移动到容器的后面.

我现有的代码如下所示:

std::list<elements> m_elements
...
bool handle(event e)
{
    for(auto &element : m_elements)
    {
        if(element->handle())
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但我现在想要做的是将handle()事件的元素移动到结尾m_elements.对于一些上下文,我正在研究Windows的GUI系统.因此,无论哪个窗口捕获鼠标,都需要在绘制时跳到顶部; m_elements正在逐一绘制窗口(因此最后一个元素位于顶部).

值得注意的是元素是std::shared_ptrs.

编辑

如果有人遇到这个问题并回答类似的情况.

我实际上需要向后遍历我的容器以处理输入,因为最后一个元素是最后绘制的,即它位于顶部,因此它应该是应该尝试拦截输入的第一个元素.

这很简单.但是,将反向迭代器拼接到容器的末端有点棘手.std::reverse_iterator.base()如果迭代器是前向迭代器,则返回NEXT迭代器,因此需要std::advance迭代器-1才能成功移动"截获"的实际元素.

for(auto itr = m_elements.rbegin(); itr != m_elements.rend(); ++itr)
{
    if((*itr)->handle(e))
    {
        auto itr2 = itr.base();
        std::advance(itr2,-1);
        m_elements.splice(m_elements.end(), m_elements, itr2);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于下一个可怜的灵魂.

c++ stl

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

为什么我的模板专业化需要匹配 originals 约束?

例如,在这段代码中:

#include <iostream>
#include <type_traits>

template<typename T>
requires std::is_same_v<T,int> || std::is_same_v<T,float> || std::is_same_v<T,double>
bool foo(const T& value)
{
    return true;
}

template<>
bool foo<double>(const double& value)
{
    return false;
}


int main()
{
    std::cout << foo(12)    << std::endl;
    std::cout << foo(1.2f)  << std::endl;
    std::cout << foo(1.2)   << std::endl;

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

如果我|| std::is_same_v<T,double>从约束中删除 ,那么第三个输出将无法编译。

但我不明白的是为什么专业化不能自动定义它自己的约束?专业化本身表明T它应该是有效类型,但现在尝试使用约束要求我提前“记录”所有专业化。考虑一个非玩具示例,其中特化做了一些完全不同的事情,如果回退版本无法对特化类型进行操作,那么在约束中列出该特化类型会令人困惑。

在我看来,编译器可以自动将专用类型包含在约束列表中,因为我在想出一个专用类型不会被视为新约束的情况时遇到了麻烦?

我希望有人知道这是编译器的技术限制还是委员会决定这样做的另一个原因。

c++ templates constraints c++20

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

我是在访问已经释放的内存,还是在这种情况下 DrMemory 报告错误?

我有以下程序:

#include <vector>

struct Comp1
{
    float x;
    std::vector<int> vec;
};

int main()
{
    std::vector<char> data;

    data.resize(sizeof(Comp1));

    Comp1* ptr1 = new (&data[0]) Comp1({.3f,{3,4,2,1}});

    data.resize(sizeof(Comp1)*2);

    Comp1* ptr2 = new (&data[sizeof(Comp1)]) Comp1({.2f,{2,3,4}});

    ptr1->~Comp1();

    std::vector<char>::iterator itrStart = data.begin();
    std::vector<char>::iterator itrEnd = itrStart + sizeof(Comp1);
    data.erase(itrStart,itrEnd);

    ptr2 = reinterpret_cast<Comp1*>(&data[0]);

    ptr2->~Comp1();

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

编译没有问题。在我的机器上执行没有问题。通过 GDB 运行它,没有任何报告。我的理解是,我在上面所做的一切都是正确的(除了可能我错过了从 a到 astd::launder时的使用?)。reinterpret_castchar*Comp1*

但是,在此程序上调用 DrMemory:

drmemory.exe test.exe -callstack_max_frames 40 -malloc_max_frames 40 -free_max_frames 40
Run Code Online (Sandbox Code Playgroud)

给我以下错误输出:

Dr. Memory version 2.2.0 build 1 built on Jul  1 …
Run Code Online (Sandbox Code Playgroud)

c++ dr-memory

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

从算术运算符返回时,为什么我不能将此类作为引用传递?

如果我有一个像这样的简单类:

template<typename T>
class coord
{
public:

    coord() : x(0), y(0)
    {
    }

    coord(T X, T Y) : x(X), y(Y)
    {
    }

    T x;
    T y;

    coord& operator-=(const coord& rhs)
    {
        (*this).x -= rhs.x;
        (*this).y -= rhs.y;
        return *this;
    }

    coord& operator+=(const coord& rhs)
    {
        (*this).x += rhs.x;
        (*this).y += rhs.y;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

与以下运营商一起(他们不是friend因为没有私人会员可以访问).

template<typename T = int>
inline coord<T> operator-(coord<T> lhs, const coord<T>& rhs)
{
    lhs -= rhs;
    return lhs;
}

template<typename T = int> …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading pass-by-reference c++11

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

被链接的另一个目标文件是否会导致段错误,即使它没有在代码中使用?

我有一个段错误,只有在链接某个目标文件时才会发生。问题是,这个对象文件中包含的类没有在main()函数中使用,也没有包含头文件。

这个其他目标文件中的代码是否可能导致段错误?

c++ segmentation-fault

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

方法链慢C++?

例如,哪些更快:

if(object.GetMemberX().IsSomething())
{
    Store(object.GetMemberX());
    object.GetMemberX().FlagSomething();
}
Run Code Online (Sandbox Code Playgroud)

要么

typeX x = object.GetMemberX();
if(typeX.IsSomething())
{
    Store(x);
    x.FlagSomething();
}
Run Code Online (Sandbox Code Playgroud)

我想如果GetMemberX()在第一个例子中返回一个指针或一个引用,编译器就无法优化掉两个调用,因为它不能保证返回的指针/引用对于每个调用都是相同的?

但在第二个例子中我存储它?

如果这是真的,它是否只适用于返回指针/引用的方法?如果我的方法按值返回它们会受益于/受到不同调用的阻碍吗?

c++ compiler-optimization

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