C++-如何从 struct sockaddr 获取 IP 和端口
我正在尝试与libmilter开发邮件mirter.因此,我必须定义一些回调函数.目前,我在Connect()函数上挣扎.声明看起来像这样: sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, struct sockaddr *hostaddr); 当客户端连接到mirter时,调用此回调.现在,我想记录主机名,IP和端口.对于主机名,这很容易.但是我无法与hostaddr一起使用. 我在Stackoverflow上找到了一些类似的文章,但没有一个对我有用.看来我必须将结构转换为sockaddr_in或sockaddr_in6,但是我会发现编译器问题,例如"成员访问不完整的类型'struct'struct sockaddr_in'" 这是我尝试的: struct sockaddr_in *sin; struct sockaddr_in6 *sin6; string ipandport; switch (ho
12 2024-04-23
编程技术问答社区
this* 在 make_unique 中的用法
我有一个Factory设计模式的小例子,我对此很感兴趣: std::make_unique(*this) ...尤其是*this. 这是否意味着clone()方法返回std::unique_ptr指向工厂类的成员? createInstance()总是返回Factory类的同一成员? 我只是感到困惑,因为std::make_unique(*this) A在构造函数std::string中,而不是指向自身的指针. class Base { public: virtual ~Base() {} virtual std::unique_ptr clone() = 0; virtual void print() = 0; }; class A: public Base { std::string name_; public: A(std::
16 2024-04-22
编程技术问答社区
为什么 unique_ptr<T>::~unique_ptr 需要 T 的定义?
如果我有一个" bar"类: // bar.h class Bar { public: Bar() { } }; 我在另一个类" foo"中向std :: unique_ptr宣称使用: // foo.h #include class Bar; class Foo { public: Foo(); private: std::unique_ptr bar_; }; 以及我将其定义包括在foo的实现文件中: // foo.cpp #include "foo.h" #include "bar.h" Foo::Foo() : bar_(new Bar) { } 我得到编译时错误"'sizeof'的无效申请' 我从 > and 解决方案 unique_ptr调用Bar::~Bar delete Bar Bar的驱动器.因此,~unique_ptr需要查看Bar::~Bar.
16 2024-04-22
编程技术问答社区
我应该赋值还是重置 unique_ptr?
鉴于常见的情况是,拥有的对象的寿命与其所有者链接在一起,我可以使用一种独特的指针之一. . 可以分配: class owner { std::unique_ptr owned; public: owner() { owned=std::unique_ptr(new someObject()); } }; 可以使用重置方法: class owner { std::unique_ptr owned; public: owner() { owned.reset(new someObject()); } }; 为了最佳实践的利益,我应该宁愿一种形式而不是另一种形式吗? 编辑:对不起.我过度简化了.堆分配以初始方法而不是在CTOR中发生.因此,我不能使用启动器列表.
14 2024-04-22
编程技术问答社区
C++ 中 sizeof() 返回的向量大小
我只是在尝试C ++,这是我执行的代码片段: int main() { std::vector data = { 1, 2, 3, 4, 5 }; std::cout 使用动态存储,如文档中所述,可以更改其大小的大小.与std::array不同,它不是汇总类型,并且存储的数据不是类存
16 2024-04-22
编程技术问答社区
用其他共享_ptr 数据初始化的 std::shared_ptr
我正在使用新的C ++ 11功能,例如std :: shared_ptr,因为我将C代码转换为类,并且在此代码中,大量使用了"老式"指针. 我有一个疑问:在一个类的方法中,我使用local shared_ptr,可以用传递给另一个smart_ptr的引用的数据初始化它们,然后修改数据? 示例: void myFunction(std::shared_ptr &my_reference) { std::shared_ptr my_local_ptr(my_reference.get()); /* Doing stuff on local pointer, which modifies the object kept by my_reference pointer */ } 我做错了吗?或者您认为最好直接修改my_reference中的数据,而无需进行此冗余操作? 问候 Mike 解决方案 您所做的是错误的(这在技术
20 2024-04-22
编程技术问答社区
通过调用返回类本身共享_ptr 的方法,强制用户创建新实例
我希望阻止用户通过构造函数创建新实例,因此我将构造函数标记为私有方法. 更重要的是,我需要提供一种返回用于自动管理实例寿命的对象的方法. 这是我首先写的代码段: #include #include class Foo : public std::enable_shared_from_this { private: //the user should not construct an instance through the constructor below. Foo(int num):num_(num) { std::cout getFoo() { return shared
22 2024-04-22
编程技术问答社区
在创建派生类对象时使用 shared_from_this() 的两阶段构造
我有一个带有基类的设置 class Object : public enable_shared_from_this { ... }; 我从enable_shared_from__this继承,因为我需要经常调用shared_from_this().在对象的某些派生中,我需要从instructor中调用shared_from_this(),这是无法完成的: class Thing : public Object { public: Thing() : Object(...) { doSomething(shared_from_this()); /* error */ } }; 因此,解决的是两阶段的结构. class Thing : public Object { public: Thing() : Object(...) { } void Init() { /* safe to call shared_from_t
18 2024-04-22
编程技术问答社区
共享指针的对象被删除,而共享_ptr 的实例仍在作用域中
我有一个STL映射,其中包含在多个线程中操纵的对象的共享指针.共享_ptr拥有的对象被删除,而智能指针仍存在于容器和/或其他功能的范围中.所有共享_ptr实例都是按值传递的(因此滥用参考的问题不是问题).我的印象在这里存在(从现有共享的_ptr复制),它拥有的对象不会被划分. 这基本上是我在做的: /* Remove Event response in Thread A */ std::map>::iterator it = objects.find(id); if(it != objects.end()) { std::shared_ptr ob = it->second; objects.erase(it); //Do cleanup work with ob } /* Add Event response in Thread B */ std::map
14 2024-04-22
编程技术问答社区
带有 shared_ptr 和 unique_ptr 的不完整类型
我想理解为什么unique_ptr破坏者需要在破坏时完成类型,而shared_ptr则不是这种情况. 霍华德·辛南特(Howard Hinnant)的这个博客简短地提到了它与静态和动态删除器有关.我正在寻找有关为什么可能是这种情况的更详细的解释(可能是编译器实施特定的,在这种情况下,一个示例将很有帮助).使用动态删除器,它是否限制了驱动器被绑定? 解决方案 霍华德·辛南特(Howard Hinnant)正在简化.他确切地说,如果您将默认的deleter用于std::unique_ptr,则需要完整的类型.对于默认的deleter,它只是为您调用delete. 静态和动态删除器的要旨是 class A; void static_delete(A* p) { delete p; } void (*dynamic_delete)(A*) = /* somehow */; int main() { A* p = /* somehow */; st
22 2024-04-22
编程技术问答社区
std::make_shared/std::make_unique 不使用列表初始化的原因是什么?
要具体: direct-list-Initialization ( cppreference .com (3)). std::make_shared和均匀初始化特征均在 c ++ 11 中引入.因此,当在堆上分配对象时,我们可以使用汇总初始化.这是直接初始化没有构造函数的对象的好方法,例如聚合,豆荚等. 在函数中宣布休闲的现实情况,有效地向lambda提供一组参数非常普遍,就我的经验而言: void foo() { struct LambdaArgs { std::string arg1; std::string arg2; std::string arg3; }; auto args = std::make_shared(LambdaArgs{"1", "2", "3"}); auto lambda = [args] { /// ...
12 2024-04-22
编程技术问答社区
两个不同进程的 2 个 std::atomic 变量位于同一地址?
我阅读了C ++标准(N4713)'S§32.6.13: 无锁的操作也应无锁定.那是, 通过两个不同的位置在同一内存位置上的原子操作 地址将在原子上进行交流.实施不应 取决于任何人为状态.此限制可以实现 通过内存的通信多次映射到一个过程中 通过在两个过程之间共享的内存. 因此,听起来可以在同一内存位置执行无锁的原子操作.我想知道如何完成. 假设我在Linux上有一个命名的共享内存段(通过SHM_OPEN()和MMAP()).例如,如何在共享内存段的前4个字节上执行无锁操作? 起初,我认为我只能reinterpret_cast指向std::atomic*的指针.但是后来我阅读了 当我们设计C ++ 11原子时,我遭到了这样的误解 可以半典型地将原子操作应用于数据 使用 之类的代码,并非被声明为原子 int x; reinterpret_cast&>(x).fetch_add(1); 如果原子和int的表示形式显然会
18 2024-04-22
编程技术问答社区
使用模板 SFINAE 进行有条件编译的 c++ 日志函数
我正在评估是否可以利用C ++ 11功能来替换日志宏而无需任何运行时额外费用. 我提出了这个演示: enum class LogLevel { Fatal = 0, DFatal = 1, Error = 2, Normal = 3, Verbose = 4, Debug = 5 }; constexpr LogLevel log_compiled = LogLevel::Normal; LogLevel log_runtime = LogLevel::Error; #ifdef NDEBUG constexpr LogLevel log_fatal = LogLevel::Fatal; #else constexpr LogLevel log_fatal = LogLevel::DFatal; #endif template
14 2024-04-22
编程技术问答社区
如何使用 std::enable_if 约束类模板和数据成员
我有一个类模板: template class foo { }; 我只想在a + b == 10时实例化. 我可以使用std::enable_if? 使这可能做到这一点 此外,如果我在class foo中有一个数据成员: template class foo { int c; }; 我只想有c a == 5. 如何使用std::enable_if进行操作? 这是使用std::enable_if>? 的正确情况 解决方案 我想您可以更好地使用static_assert来执行该约束,而不是enable_if template class foo { static_assert(a+b==10, "a+b is not 10"); }; int main() { foo f; // will compile foo
20 2024-04-22
编程技术问答社区
为什么需要为 `std::enable_if`设置默认值?
为什么我必须在此std::enable_if中使用默认值(::type = 0)? 我看到了示例,它在没有它的地方工作.例如/30/overload-resolution-4.html #include #include template ::value, T>::type = 0> void do_stuff(T t) { std::cout ::value, T>::type = 0> void do_stuff(T t) { std::cout
30 2024-04-22
编程技术问答社区
C++的R值引用和移动语义
c ++ 03存在可能暗中发生的不必要副本的问题.为此,C ++ 11引入了rvalue references和move semantics.现在我的问题是,这种不必要的复制问题是否也存在于C#和Java等语言中,还是仅仅是C ++问题?换句话说,rvalue references与C#或Java相比,使C ++ 11更有效? 就C#相关(在其中允许的运算符过载),可以说我们有一个数学向量类,我们使用它. vector_a = vector_b + vector_c; 编译器肯定会将vector_b + vector_c转换为某个临时对象(让我们称其为vector_tmp). 现在,我认为C#不能区分诸如vector_tmp或诸如vector_b之类的lvalue的临时rvalue,因此我们必须无论如何都必须将数据复制到vector_a,可以很容易地避免通过在C ++ 11中使用rvalue references和move semantics. 解决方案 C
8 2024-04-18
编程技术问答社区
C++11有C#风格的属性吗?
在C#中,有一个不错的语法糖,用于带有Getter和setter的字段.此外,我喜欢自动实施的属性,这些属性允许我写 public Foo foo { get; private set; } 在C ++中,我必须写 private: Foo foo; public: Foo getFoo() { return foo; } 在C ++ 11中是否有一些这样的概念,可以让我有一些语法糖? 解决方案 C ++语言中没有什么可以在所有平台和编译器中起作用. 但是,如果您愿意打破跨平台的兼容性并承诺对特定的编译器,则可以使用这种语法,例如 Microsoft Visual C ++ 您可以做 // declspec_property.cpp struct S { int i; void putprop(int j) { i = j; } int getprop() {
4 2024-04-10
编程技术问答社区
改变gcc/g++版本导致segfault
似乎将我使用的GCC版本从gcc 4.7.3更改为gcc 4.9.2会导致我的项目的segfault(清洁构建和运行后). 在不幸的事件转折中gdb在服务器上损坏了我 遇到此错误,目前无法使用.海湾合作委员会本身的任何已知变化可能会引起这一点?我怀疑这个问题可能是由双人免费引起的. 解决方案 您应该尝试使用Valgrind. valgrind是一种调试工具,仅需要使用-G标志编译代码.这是在程序上发现细分故障或任何内存泄漏的最佳方法. 考虑在调试时使用Valgrind选项(它在Valgrind报告的底部),例如Leak-Checkfull(我现在无法运行Valgrind,所以我无法确切告诉您它是什么). 但是,每当我编译代码时,我都会使用valgrind和它检查所有可能的故障.为了更简单,考虑甚至将VG放入Makefile规则中.
16 2024-04-10
编程技术问答社区
互锁功能和原子性:仍然困惑不解
我仍然在原子上对阅读和写作变量感到困惑.对那些试图在以前的问题中提供帮助的人表示抱歉. 我已经被告知今天 在阅读和写32bit时,无需任何Interlocked函数> long值,它吹起我的以前的信念 从窗外出来.的确,这可以支持什么 简单的读取和写入正确对齐的32位变量是 原子操作.换句话说,您不会只有一个 更新变量的部分;所有位均在原子中更新 时尚 所以我然后查看了VS2017中的atomic_long;它的operator=在当前值上使用新值进行_InterlockedExchange(). 这与MSDN不矛盾;如果读/写是原子,为什么需要这种互锁的函数? 在同一MSDN页面上,我们也有 简单的读取和写入正确对齐的64位变量是 64位窗户上的原子.读取和写入为64位值不是 保证在32位窗户上是原子. 阅读并写信给 其他尺寸的变量不能保证在任何 平台. 所以我然后进入atomic_bool's'operator=;它执行_InterlockedE
8 2024-04-10
编程技术问答社区