小编Gab*_*les的帖子

在退出作用域块时使用 std::unique_ptr 自动释放内存的情况下,为什么不直接使用堆栈?

这是关于智能指针(例如唯一指针)的一个很好的答案:什么是智能指针,我应该何时使用?.

这是他们提供的一个示例,作为唯一指针的最简单用法:

void f()
{
    {
       std::unique_ptr<MyObject> ptr(new MyObject(my_constructor_param));
       ptr->DoSomethingUseful();
    } // ptr goes out of scope -- 
      // the MyObject is automatically destroyed.

    // ptr->Oops(); // Compile error: "ptr" not defined
                    // since it is no longer in scope.
}
Run Code Online (Sandbox Code Playgroud)

然而,这引出了一个问题:在这种情况下,目标是简单地删除对象(释放内存),当它超出范围时,唯一指针指向,为什么不把整个对象放在堆栈上呢? , 像这样??

void f()
{
    {
       MyObject myobj(my_constructor_param);
       myobj.DoSomethingUseful();
    } // myobj goes out of scope -- 
      // and is automatically destroyed.

    // myobj.Oops(); // Compile error: "myobj" not defined
                     // since it is no longer …
Run Code Online (Sandbox Code Playgroud)

c++ stack smart-pointers heap-memory unique-ptr

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

适用于“memcpy()”的相同简单复制限制是否也适用于“std::copy()”?

Cppreference 指出,关于std::memcpy()(强调):

如果对象可能重叠或不可平凡复制,则 的行为memcpy 未指定并且可能未定义。

因此,我总是在使用之前检查以确保对象是可简单复制的memcpy(),如下所示:

#include <type_traits>

static_assert(std::is_trivially_copyable<T>::value, "Type T must "
    "be a trivially-copyable type in order to guarantee that `memcpy()` is safe "
    "to use on it.");
memcpy(&outputData, &data, sizeof(data));
Run Code Online (Sandbox Code Playgroud)

std::copy()然而,似乎没有这个限制:https://en.cppreference.com/w/cpp/algorithm/copy

类型必须可简单复制才能不具有未定义行为的限制是否不适用于std::copy()

另外,我刚刚在我的“placement new”答案中意识到,这让我想知道整个事情,我只是用了memcpy()代替std::memcpy(),而我没有 using namespace std;那么调用了哪个函数?是memcpy()与 不同的实现吗std::memcpy()

c++ memcpy undefined-behavior trivially-copyable

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

在C++中删除字符串中的所有元音

我编写了一段代码,可以从 C++ 中的字符串中删除所有元音,但由于某种原因,它不会删除'o'一个特定输入的元音:zjuotps

这是代码:

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s;
    cin >> s;

    string a = "aeiouyAEIOUY";

    for (int i = 0; i < s.length(); i++){
        for(int j = 0; j < a.length(); j++){
            if(s[i] == a[j]){
                s.erase(s.begin() + i);
            }
        }
    }
    cout << s;

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

当我输入:zjuotps

我得到的输出是:zjotps

c++ string algorithm

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

什么是 C++ 中对“char()”、“uint8_t()”、“int64_t()”、整数“T()”等的调用?

我以前从未见过这个函数的调用char()。这是在哪里描述的,它是什么意思?此用法是此 cppreference.com 社区 wiki 页面上示例的一部分:https://en.cppreference.com/w/cpp/string/basic_string/resize

short_string.resize( desired_length + 3 );
std::cout << "6. After:  \"";
for (char c : short_string) {
    std::cout << (c == char() ? '@' : c);  // <=== HERE ===
}
Run Code Online (Sandbox Code Playgroud)

描述中的措辞对我来说也没有任何意义,我不明白它在说什么:

将附加字符初始化为CharT().

在上下文中突出显示:

在此输入图像描述

相邻相关

  1. 促使我研究该std::string::resize()方法的原因是尝试学习如何预先分配 astd::string以便在 C 函数调用中用作缓冲区char*。这可以通过首先std::string调用my_string.resize()函数来预分配 来实现。然后,您可以安全地&my_string[0]作为标准char*写入索引my_string.size() - 1。也可以看看:
    1. 直接写入 std::string 的 char* 缓冲区
    2. 有没有办法获取 std:string 的缓冲区
    3. 如何将 a 转换std::string …

c++ initialization char

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

如何将函数名称和参数的可变参数列表传递给 C++ 中的函数?

不是What is std::invoke in c++?的重复项 。该问题专门询问了这一唯一的功能。这个问题询问一个概念,无需该功能即可 100% 解决,并且有多种替代解决方案,其中只有一些甚至使用该功能。


在 Python 中,您可以将函数名称和参数列表传递给外部函数,该外部函数调用内部函数并将这些参数传递给它,如下所示:

在Python中将带有参数的函数传递给另一个函数?

def perform(fun, *args):
    fun(*args)

def action1(args):
    # something

def action2(args):
    # something

perform(action1)
perform(action2, p)
perform(action3, p, r)
Run Code Online (Sandbox Code Playgroud)

我如何在 C++ 中做到这一点?

c++ variadic variadic-templates parameter-pack

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

C/C++ 是否有一组标准的退出代码?

AFAIK,退出代码可能会根据应用程序和项目中采用的约定而有所不同。但是,我想知道是否有 C/C++ 项目的退出代码标准列表。

c c++ exit-code exit

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