标签: std

C++ std :: queue :: pop()调用析构函数.指针类型是什么?

我有一个std::queue被包装为模板化的类来创建一个线程安全的队列.我有这个类的两个版本:一个存储值类型,一个存储指针类型.

对于指针类型,我在销毁时删除队列的元素时遇到问题.原因是我不知道如何安全地从队列中删除项目.

参考状态(无思考力的,所以我想它实际上并没有状态的话)是从队列中删除元素的唯一方法是调用pop().该引用还表示pop()调用该项的析构函数.

好吧,这会导致我的指针类型出现问题,因为它们可能会或可能不会指向聚合.如果其中一个指向聚合,它们都会,但由于包装是模板化的,因此无法保证我们正在处理哪种类型(聚合或非聚合).

那么,当pop()调用析构函数时,会发生什么?如何确保删除所有内容并正确释放内存?

最后,我的解决方案是使用旧版本的GCC for ARM9.我无法控制这一点.我知道有些库有智能指针和容器可以在这里提供帮助,但它们对我来说是禁止的.

c++ queue memory-management std

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

为什么std :: type_info不可复制?我可以把它存放在某个地方吗?

std::type_info课程不可复制.这使得将其存储在对象中以供以后使用变得困难.我该怎么办?

c++ std typeid typeinfo

15
推荐指数
2
解决办法
2587
查看次数

将'wchar_t*'输出到'ofstream'

我想通过我声明的两个指针将文本输出到文件:

wchar_t   *Col1="dsffsd", *Col2="sdfsf";
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

std::ofstream fout;
fout.open(NativeDatabasePathHist);
fout<<"testing";
fout<<" "<<Col1<<" "<<Col2;
fout.close();
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

测试113 113

为什么当我打印Col1Col2,我得到的数字,而不是字符串?

c++ file wchar-t std wofstream

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

libstdc ++不实现std :: stoi吗?

我想用std::stoi.虽然我可以使用::atoi(str.c_str())它会使代码更清洁,如果这将工作.但Eclipse告诉我:

函数'stoi'无法解决

我查了一下

  • 标题<string>包括在内,
  • 包含路径设置正确,我可以使用std::string,
  • 编译器标志-std=c++0x -std=c++11也是设置的.

stoi()失踪的gcc,或者是不知何故我的错?

我正在使用gcc(Debian 4.7.2-4)4.7.2.

c++ gcc std c++11

15
推荐指数
2
解决办法
9498
查看次数

使用weak_ptr的观察者模式

我正在尝试Subject观察者模式中编写一个安全类.我想知道使用weak_ptr是否是以下列方式存储IObserver实例的最佳方式:

  • IObserver被释放后无法使用实例.
  • Subject类不抱上IObserver应free'd引用(流逝的听众的问题).
  • Subject类必须是线程安全的.

不幸的是,我们的编码标准说我们不允许使用boost.我想我以前的生活中是一个坏人.幸运的是,我被允许使用C++ 11(Visual Studio 2012附带的内容).

这是一个示例Observer类.

// Observer interface that supports notify() method
class IObserver
{
public:
    virtual void notify() const = 0;
    virtual ~IObserver() {}
};

// Concrete observer implementation that prints a message
class Observer : public IObserver
{
public:
    Observer( const std::string& message) : m_message( message ){}

    void notify() const {
        printf( "%s\r\n", m_message.c_str() …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers std c++11

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

如何将std :: vector <unsigned char>转换为vector <char>而不复制?

我无法找到这个问题,这是我面临的一个实际问题.

我有一个文件加载实用程序,返回std::vector<unsigned char>包含整个文件内容.但是,处理函数需要contiguos数组char(并且不能更改 - 它是库函数).由于使用处理函数的类仍然存储数据的副本,我想将其存储为vector<char>.这里的代码可能更具说明性.

std::vector<unsigned char> LoadFile (std::string const& path);

class Processor {
    std::vector<char> cache;
    void _dataOperation(std::vector<char> const& data);

public:
    void Process() {
        if (cache.empty())
            // here's the problem!
            cache = LoadFile("file.txt");

        _dataOperation(cache);
    }
};
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为(显然)没有适当的转换.但是,我们可以确定临时向量将占用相同数量的内存(IOW sizeof(char) == sizeof(unsigned char))

天真的解决方案是迭代临时内容并投射每个角色.我知道在正常情况下,operator= (T&&)会被调用.

在我的情况下,重新解释转换是安全的,因为我确信我只会读取ASCII字符._dataOperation无论如何,任何其他角色都会被抓住.

所以,我的问题是:如何以一种不涉及复制的方式正确安全地转换临时向量?

如果不可能,我宁愿采用安全的复制方式而不是不安全的非复制方式.我也可以LoadFile改为返回vector<char>vector<unsigned char>.

c++ vector std

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

命名空间'std'中没有名为'atomic'的类型

为什么不呢

std::atomic<int> index;
Run Code Online (Sandbox Code Playgroud)

工作?

目前使用LLVM 3.1与这些参数

C Language Dialect GNU [-std=gnu99]
C++ Language Dialect [-std=c++11]
C++ Standard Library libc++(LLVM C++ standard library with C++11 support)
Run Code Online (Sandbox Code Playgroud)

c++ xcode atomic std c++11

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

'sqrt'不是'std'的成员

我在linux中编译我的程序 - 它有以下几行:

std::sqrt((double)num);
Run Code Online (Sandbox Code Playgroud)

在Windows上没关系,但是在linux上我得到'sqrt'不是'std'的成员我有一个包括math.h

有什么问题吗?

c++ math std sqrt

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

Barebones C++没有标准库?

GCC和Clang等编译器允许在没有C++标准库的情况下编译C++程序,例如使用-nostdlib命令行标志.似乎这种情况经常无法与您联系,例如:

void f() noexcept { throw 42; }
int main() { f(); }
Run Code Online (Sandbox Code Playgroud)

通常无法链接由于像未定义的符号__cxa_allocate_exception,typeinfo for int,__cxa_throw,__gxx_personality_v0,__clang_call_terminate,__cxa_begin_catch,std::terminate()等.

即使是简单的

int main() {}
Run Code Online (Sandbox Code Playgroud)

无法链接

ld:警告:找不到输入符号_start; 默认为0000000000400120

并在执行时被操作系统杀死.使用-c编译器仍会运行显式失败的链接器:

LD:错误mytest(.eh_frame); 不会.eh_frame_hdr创建任何表.

在不使用和链接到标准库的情况下编程和编译C++应用程序或库是否是一个现实的目标?如何在Linux上使用GCC或Clang编译我的代码?没有标准库,哪些核心语言功能无法使用?

c++ std

15
推荐指数
2
解决办法
4150
查看次数

在某些情况下,std :: is_floating_point为float返回false

在某些情况下,请参见下面一个例子,std::is_floating_point在返回falsefloat.

#include <iostream>
#include <type_traits>
#include <vector>

int main()
{
    ::std::cout << typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])).name() << ::std::endl;
    if (::std::is_floating_point< decltype(::std::vector< float >()[::std::vector< float >().size()]) >::value)
    {
        ::std::cout << "floating point" << ::std::endl;
    }
    else
    {
        ::std::cout << "not floating point" << ::std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC的输出

f
not floating point
Run Code Online (Sandbox Code Playgroud)

在这个例子中,人们可以看到它typeid::std::vector< float >()[::std::vector< float >().size()]视为a float,它返回正确的名称.人们也可以检查typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])) == typeid(flat)退货true.但是, …

c++ floating-point types std typeid

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