小编Gar*_*zet的帖子

VSCode - 使用集成终端而不是调试控制台进行调试/启动

有没有办法在 Visual Studio Code 中使用集成终端来调试/启动代码而不是调试控制台?

目前,我正在使用外部控制台窗口在 VSCode 中调试代码,但是在全屏调试时因为它进入后台所以不是很方便。调试控制台的问题在于它不允许输入,所以如果我的程序需要任何输入并且我不使用外部控制台,它就会卡住。

或者,有没有办法将输入输入调试控制台?

编辑:我正在尝试使用 Microsoft 的 C++ 插件调试 C++ 代码。这是我的launch.json

{
        "name": "Debug",
        "type": "cppvsdbg",
        "request": "launch",
        "program": "${workspaceFolder}/bin/Debug/HelloWorld.exe",
        "args": [],
        "preLaunchTask": "Build",
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "console": "integratedTerminal"
}
Run Code Online (Sandbox Code Playgroud)

debugging visual-studio-code

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

char* 和 std::byte* 之间的reinterpret_cast

我正在阅读类型别名规则,但无法确定此代码中是否包含 UB:

std::vector<std::byte> vec = {std::byte{'a'}, std::byte{'b'}};
auto sv = std::string_view(reinterpret_cast<char*>(vec.data()), vec.size());
std::cout << sv << '\n';
Run Code Online (Sandbox Code Playgroud)

我相当确定事实并非如此,但我经常对 C++ 感到惊讶。介于和 之间并且reinterpret_cast始终char*允许吗?unsigned char*std::byte*

此外,在此类转换中添加合法的内容,例如:const

std::array<char, 2> arr = {'a', 'b'};
auto* p = reinterpret_cast<const std::byte*>(arr.data());
Run Code Online (Sandbox Code Playgroud)

再次,我怀疑这是合法的,因为它说

AliasedType 是 DynamicType 的有符号或无符号变体(可能是 cv 限定的)

但我想reinterpret_cast一劳永逸地确定。

c++ language-lawyer reinterpret-cast

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

如何使用模板而不是宏来绑定“ this”?

我试图用模板替换代码中的所有宏。我有一个宏,它绑定this到函数的第一个参数,以便可以在静态上下文中使用成员函数。如何使用模板来实现?

我想要此功能:

#define BIND_EVENT_FN(func) std::bind(&func, this, std::placeholders::_1)
Run Code Online (Sandbox Code Playgroud)

或使用lambda:

#define BIND_EVENT_FN(func) [this](Event& e){ return func(e); }
Run Code Online (Sandbox Code Playgroud)

与此类似的东西,但显然不完全像这样,因为它不能编译:

template<class T>
auto bind_event_fn(T& func)
{
    return [this](Event&& e){ return func(e); };
}
Run Code Online (Sandbox Code Playgroud)

下面的最小工作示例,是否可以替换宏?

#include <functional>
#include <iostream>

#define LAMBDA_BIND_FN(fn) [this](const int& event) { return fn(event); }
#define BASIC_BIND_FN(func) std::bind(&func, this, std::placeholders::_1)

void run_in_static_context(std::function<void(const int&)> fn)
{
    fn(42);
}

class A {
  public:
    A()
    {
        run_in_static_context(LAMBDA_BIND_FN(A::member_fn));
    }
  private:
    void member_fn(const int& event)
    { 
        std::cout << "Event: " << event << std::endl;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ lambda stdbind c++17

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

GStreamer最小程序泄漏内存

我有一个最小的GStreamer程序:

#include <gst/gst.h>

int main() {
   gst_init(NULL, NULL);
   gst_deinit();
}
Run Code Online (Sandbox Code Playgroud)

我使用gcc test.c $(pkg-config --cflags --libs gstreamer-1.0) -fsanitize=address(gcc 版本为 12.1.0)构建它,运行它并从地址清理器获得以下输出:

==87326==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 16384 byte(s) in 1 object(s) allocated from:
    #0 0x7f53e28bfa89 in __interceptor_malloc /usr/src/debug/gcc/libsanitizer/asan/asan_malloc_linux.cpp:69
    #1 0x7f53e26c1b19 in g_malloc (/usr/lib/libglib-2.0.so.0+0x5db19)

SUMMARY: AddressSanitizer: 16384 byte(s) leaked in 1 allocation(s).
Run Code Online (Sandbox Code Playgroud)

我是 GStreamer 和 GLib 的新手。这对于 GStreamer 程序来说正常吗?如果是的话,在使用消毒剂运行单元测试时,有什么优雅的方法可以忽略这种泄漏?

gcc memory-leaks glib gstreamer leak-sanitizer

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