13.6.3 为HasPtr定义移动构造函数

本文详细介绍了HasPtr类的设计与实现,包括构造函数、赋值运算符、移动构造函数及友元函数swap的使用。通过具体示例展示了HasPtr类在资源管理、对象复制和移动构造过程中的工作原理。

HasPtr class:

#pragma once
#include <iostream>
#include <string>

class HasPtr {
public:
   HasPtr(const std::string &s, int a)
      : ps(new std::string(s)), i(a) {
      std::cout << "Sting with int constructor execute" << std::endl;
   }

   HasPtr(const std::string &s = std::string())
      : ps(new std::string(s)), i(std::stoi(s)) {
      std::cout << "String constructor execute" << std::endl;
   }

   HasPtr(const HasPtr &obj)
      : ps(new std::string(*obj.ps)), i(obj.i) {
      std::cout << "Copy constructor execute" << std::endl;
   }

   friend void swap(HasPtr &lhs, HasPtr &rhs) {
      std::cout << "HasPtr::swap function execute" << std::endl;
      std::swap(lhs.ps, rhs.ps);
      std::swap(lhs.i, rhs.i);
   }

   HasPtr(HasPtr &&s) noexcept : ps(s.ps), i(s.i) { s.ps = nullptr; }

   HasPtr & operator=(HasPtr s) {
      swap(*this, s);
      return *this;
   }

   ~HasPtr() {
      delete ps;
   }

   std::string get_str() const {
      return *ps;
   }

   int get_i() const {
      return i;
   }

   bool operator<(const HasPtr obj) const {
      std::cout << "Operator < execute" << std::endl;
      return i < obj.i;
   }

private:
   std::string *ps;
   int i;
};

使用移动构造函数为赋值拷贝带来了好处:
复制拷贝运算符的形参不是引用,需要使用拷贝构造函数来传递。如果等号右边的对象是右值,则会使用移动构造函数,将原对象的指针设为空。赋值操作符只需要swap即可,无需指定析构。右值对象出作用域时会自行析构。
main.cpp

int main()
{
   HasPtr a("1"), b("2");
   a = std::move(b);

   return 0;
}

执行过程:
通过两个string构造两个HasPtr对象。a调用复制拷贝运算符,以b为实参通过移动构造函数构造形参。
调用swap函数交换指针。
析构所有对象
在这里插入图片描述
值得一提的是:对空指针调用delete运算符不会产生错误(析构函数会析构那个被move过的原对象,其指针已经被置为空)。delete运算符会检查指针是否为空。

isaac sim配置ros2[58.287s] [ext: isaacsim.sensors.physx-2.2.4] startup 2025-07-03 15:41:07 [58,275ms] [Error] [omni.ext._impl.custom_importer] Failed to import python module isaacsim.sensors.physx. Error: No module named &#39;torch&#39;. Traceback: Traceback (most recent call last): File "/home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/custom_importer.py", line 76, in import_module return importlib.import_module(name) File "/home/czt/isaacsim/kit/python/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/czt/isaacsim/exts/isaacsim.sensors.physx/isaacsim/sensors/physx/__init__.py", line 10, in <module> from .scripts import * File "/home/czt/isaacsim/exts/isaacsim.sensors.physx/isaacsim/sensors/physx/scripts/__init__.py", line 13, in <module> from .rotating_lidar_physX import RotatingLidarPhysX File "/home/czt/isaacsim/exts/isaacsim.sensors.physx/isaacsim/sensors/physx/scripts/rotating_lidar_physX.py", line 15, in <module> from isaacsim.core.api.sensors.base_sensor import BaseSensor File "/home/czt/isaacsim/exts/isaacsim.core.api/isaacsim/core/api/__init__.py", line 11, in <module> from isaacsim.core.api.physics_context.physics_context import PhysicsContext File "/home/czt/isaacsim/exts/isaacsim.core.api/isaacsim/core/api/physics_context/__init__.py", line 9, in <module> from isaacsim.core.api.physics_context.physics_context import PhysicsContext File "/home/czt/isaacsim/exts/isaacsim.core.api/isaacsim/core/api/physics_context/physics_context.py", line 13, in <module> from isaacsim.core.simulation_manager import SimulationManager File "/home/czt/isaacsim/exts/isaacsim.core.simulation_manager/isaacsim/core/simulation_manager/__init__.py", line 1, in <module> from .impl.extension import Extension File "/home/czt/isaacsim/exts/isaacsim.core.simulation_manager/isaacsim/core/simulation_manager/impl/__init__.py", line 1, in <module> from .extension import * File "/home/czt/isaacsim/exts/isaacsim.core.simulation_manager/isaacsim/core/simulation_manager/impl/extension.py", line 7, in <module> from .simulation_manager import SimulationManager File "/home/czt/isaacsim/exts/isaacsim.core.simulation_manager/isaacsim/core/simulation_manager/impl/simulation_manager.py", line 6, in <module> import isaacsim.core.utils.torch as torch_utils File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/torch/__init__.py", line 9, in <module> from .maths import * File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/torch/maths.py", line 13, in <module> import torch ModuleNotFoundError: No module named &#39;torch&#39; 2025-07-03 15:41:07 [58,276ms] [Error] [carb.scripting-python.plugin] Exception: Extension python module: &#39;isaacsim.sensors.physx&#39; in &#39;/home/czt/isaacsim/exts/isaacsim.sensors.physx&#39; failed to load. At: /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(213): startup /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(328): startup_extension PythonExtension.cpp::startup()(2): <module> /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/ext_commands.py(33): do /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/undo/undo.py(81): execute /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/commands/command.py(463): execute /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/common.py(509): toggle_self /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/events.py(80): _run /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/base_events.py(1909): _run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(197): run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(263): <lambda> 2025-07-03 15:41:07 [58,276ms] [Error] [omni.ext.plugin] [ext: isaacsim.sensors.physx-2.2.4] Failed to startup python extension. [58.902s] [ext: isaacsim.sensors.rtx-13.6.3] startup 2025-07-03 15:41:08 [58,888ms] [Error] [omni.ext._impl.custom_importer] Failed to import python module isaacsim.sensors.rtx. Error: No module named &#39;torch&#39;. Traceback: Traceback (most recent call last): File "/home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/custom_importer.py", line 76, in import_module return importlib.import_module(name) File "/home/czt/isaacsim/kit/python/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/czt/isaacsim/exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/__init__.py", line 10, in <module> from .scripts import * File "/home/czt/isaacsim/exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/scripts/__init__.py", line 10, in <module> from .commands import * File "/home/czt/isaacsim/exts/isaacsim.sensors.rtx/isaacsim/sensors/rtx/scripts/commands.py", line 17, in <module> from isaacsim.core.utils.prims import delete_prim File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/prims.py", line 25, in <module> from isaacsim.core.utils.types import SDF_type_to_Gf File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/types.py", line 12, in <module> import torch ModuleNotFoundError: No module named &#39;torch&#39; 2025-07-03 15:41:08 [58,888ms] [Error] [carb.scripting-python.plugin] Exception: Extension python module: &#39;isaacsim.sensors.rtx&#39; in &#39;/home/czt/isaacsim/exts/isaacsim.sensors.rtx&#39; failed to load. At: /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(213): startup /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(328): startup_extension PythonExtension.cpp::startup()(2): <module> /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/ext_commands.py(33): do /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/undo/undo.py(81): execute /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/commands/command.py(463): execute /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/common.py(509): toggle_self /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/events.py(80): _run /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/base_events.py(1909): _run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(197): run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(263): <lambda> 2025-07-03 15:41:08 [58,888ms] [Error] [omni.ext.plugin] [ext: isaacsim.sensors.rtx-13.6.3] Failed to startup python extension. [59.517s] [ext: isaacsim.ros2.bridge-4.1.15] startup 2025-07-03 15:41:08 [59,500ms] [Error] [omni.ext._impl.custom_importer] Failed to import python module isaacsim.ros2.bridge. Error: No module named &#39;torch&#39;. Traceback: Traceback (most recent call last): File "/home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/custom_importer.py", line 76, in import_module return importlib.import_module(name) File "/home/czt/isaacsim/kit/python/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/czt/isaacsim/exts/isaacsim.ros2.bridge/isaacsim/ros2/bridge/__init__.py", line 10, in <module> from .scripts.camera_info_utils import * File "/home/czt/isaacsim/exts/isaacsim.ros2.bridge/isaacsim/ros2/bridge/scripts/camera_info_utils.py", line 17, in <module> from isaacsim.core.utils.render_product import get_camera_prim_path, get_resolution File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/render_product.py", line 13, in <module> from isaacsim.core.utils.prims import set_prim_hide_in_stage_window, set_prim_no_delete File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/prims.py", line 25, in <module> from isaacsim.core.utils.types import SDF_type_to_Gf File "/home/czt/isaacsim/exts/isaacsim.core.utils/isaacsim/core/utils/types.py", line 12, in <module> import torch ModuleNotFoundError: No module named &#39;torch&#39; 2025-07-03 15:41:08 [59,500ms] [Error] [carb.scripting-python.plugin] Exception: Extension python module: &#39;isaacsim.ros2.bridge&#39; in &#39;/home/czt/isaacsim/exts/isaacsim.ros2.bridge&#39; failed to load. At: /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(213): startup /home/czt/isaacsim/kit/kernel/py/omni/ext/_impl/_internal.py(328): startup_extension PythonExtension.cpp::startup()(2): <module> /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/ext_commands.py(33): do /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/undo/undo.py(81): execute /home/czt/isaacsim/extscache/omni.kit.commands-1.4.9+d02c707b.lx64.r.cp310/omni/kit/commands/command.py(463): execute /home/czt/isaacsim/extscache/omni.kit.window.extensions-1.4.25+d02c707b/omni/kit/window/extensions/common.py(509): toggle_self /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/events.py(80): _run /home/czt/isaacsim/kit/python/lib/python3.10/asyncio/base_events.py(1909): _run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(197): run_once /home/czt/isaacsim/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py(263): <lambda> 2025-07-03 15:41:08 [59,500ms] [Error] [omni.ext.plugin] [ext: isaacsim.ros2.bridge-4.1.15] Failed to startup python extension. 2025-07-03 15:41:09 [60,116ms] [Error] [omni.graph.core._impl.extension] Extension isaacsim.ros2.bridge-4.1.15 failed to register Python nodes - &#39;isaacsim.ros2.bridge&#39; [60.287s] [ext: isaacsim.ros2.bridge-4.1.15] shutdown [60.288s] [ext: isaacsim.sensors.camera-0.2.9] shutdown [60.289s] [ext: isaacsim.sensors.physics-0.3.5] shutdown [60.290s] [ext: isaacsim.sensors.rtx-13.6.3] shutdown [60.291s] [ext: isaacsim.core.nodes-2.1.4] shutdown [60.292s] [ext: isaacsim.sensors.physx-2.2.4] shutdown [60.293s] [ext: isaacsim.core.api-4.2.16] shutdown [60.295s] [ext: isaacsim.core.prims-0.3.7] shutdown [60.295s] [ext: isaacsim.core.simulation_manager-0.3.3] shutdown
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值