月经来黑色是什么原因| 失恋什么意思| 缩影是什么意思| 汗为什么是咸的| 蝉什么时候叫| 睡觉老是做梦是什么原因| 五色土有什么风水作用| 吃了发芽的土豆会有什么症状| 水满则溢月盈则亏是什么意思| 尾骨疼是什么原因| 三朵花代表什么意思| 秦始皇原名叫什么名字| 梦遗是什么| 六月二十六是什么日子| 钝感力什么意思| ph值小于7是什么意思| 上皮细胞高是什么原因| 火龙果和什么不能一起吃| 裂纹舌是什么原因| 什么方法| ua是什么牌子| 黄体酮不足吃什么药| 养狗养不活是什么兆头| cc是什么意思| 扁平疣用什么药膏除根| 蜘蛛结网预示着什么| 小便不利什么意思| 虾皮不能和什么一起吃| 月经肚子疼是什么原因| 黄糖是什么糖| 酸梅汤不能和什么一起吃| 庞统和诸葛亮什么关系| 嗓子不舒服吃什么药| 投诉护士找什么部门| 为什么头皮会疼| 南瓜和什么不能一起吃| 脚肿挂什么科室| 起酥油是什么| 随喜是什么意思| c罗为什么不结婚| 艾灸痒痒的是什么原因| 975是什么意思| 从来就没有什么救世主| 献完血应该注意什么| 吃马齿苋有什么好处| 宫腔粘连带是什么意思| 耄耋读什么| 脸红是什么原因引起的| 交叉感染是什么意思| 声带小结是什么意思| 心智是什么意思| 钾离子低的原因是什么| 周吴郑王是什么意思| 狗狗怀孕吃什么| 夏天喝绿茶有什么好处| 抽血前喝水有什么影响| 长期服用丙戊酸钠有什么副作用| honey什么意思| 女人喝劲酒有什么好处| 什么病需要做透析| 忧郁的意思是什么| 吃芒果有什么好处| 痱子长什么样子图片| 平肝什么意思| 3月4号什么星座| 肺热吃什么| 宾馆和酒店有什么区别| 属猴是什么命| 马脸是什么脸型| 什么是尿毒症| 梦见辣椒是什么预兆| 胳肢窝痒是什么原因| 尼龙属于什么材料| 美女什么都没有穿| 求人办事送什么礼物好| 干是什么意思| navy什么意思| 什么是荨麻疹| 胃热是什么原因引起的| 同房什么意思| 什么叫多动症| gm什么意思| 沙发是什么发质| 消防支队长是什么级别| 什么是电离辐射| 十二指肠溃疡吃什么药| 肇庆有什么大学| 李逵代表什么生肖| 醋泡脚有什么好处| 茱萸是什么意思| 西芹和芹菜有什么区别| 牙疼脸肿了吃什么药| 塌陷是什么意思| 双鱼座和什么座最配| 探花是什么意思| 九月28号是什么星座| 炖肉放山楂起什么作用| 拉不出大便吃什么药| 肠炎是什么症状| 举不胜举的举是什么意思| 为什么有的女人欲太强| 适合什么发型| 元老是什么意思| 什么是优质蛋白食物| 臀纹不对称有什么影响| 一什么蝉| 骨膜炎是什么症状| 吃什么补胰腺最好| 癸酉五行属什么| 腿长身子短有什么说法| miu什么牌子| 鲨鱼是什么动物| 腋窝爱出汗是什么原因| 为什么鞋子洗了还是臭| 19朵玫瑰代表什么意思| 眼圈黑是什么原因| 裸睡是什么意思| 中秋节的习俗是什么| 早期教育是什么| 自提是什么意思| 长痘痘去医院挂什么科| 生日可以送什么礼物| 堂食是什么意思| dew是什么意思| 嗓子哑是什么原因引起的| 我要控制我自己是什么歌| 什么样的生活| prbpm是什么意思| 辅酶q10什么价格| 黑曜石是什么| 结婚前一天晚上的宴会叫什么| 别车是什么意思| 黑猫警长是什么猫| 恩五行属什么| 三秦是什么意思| o型血和o型血生的孩子是什么血型| 肝做什么检查最准确| er什么意思| 去鱼腥味最好的方法是什么| 什么是健康管理| 1月16日是什么星座| 人为什么会做噩梦| 什么是虚拟币| 助产士一般什么学历| 突然头晕目眩是什么原因| 今年属于什么年| 铭是什么意思| 翠玉是什么玉| nc是什么意思| 长痔疮有什么症状| 瘁是什么意思| 月经可以吃什么水果| 自汗恶风是什么意思| 白日做梦是什么生肖| 芥蒂是什么意思| 河粉是什么材料做的| 牡丹是什么植物| 三七花泡水喝有什么功效和作用| 避免是什么意思| 一什么旋风| 伪骨科是什么| 什么宽带网速快又便宜| 麻古是什么| 清热利湿吃什么药| 遗憾是什么| 初遇是什么意思| 光动力治疗什么| 女人耳鸣是什么前兆| 什么是静息心率| 一什么田野| 脊髓空洞是什么意思| 望梅止渴什么意思| hrp是什么意思| 睾丸疼是什么原因| 榄仁叶是什么树的叶子| 胃窦病变意味着什么| 殊荣是什么意思| 蛋清加蜂蜜敷脸有什么好处| 儿童风寒咳嗽吃什么药| 空腹血糖高吃什么药| 12月27日是什么星座| 脖子发黑是什么原因| 坐骨神经痛用什么药最好| cnc男装是什么档次| 家有喜事指什么生肖| 裹小脚是什么时候开始的| 扁桃体肥大是什么原因造成的| 花胶是鱼的什么部位| 女人排卵是什么时候| 聪明的动物是什么生肖| 黄忠字什么| 膝盖肿胀是什么原因| burgundy是什么颜色| 尿痛什么原因| 甲亢什么症状| rgp是什么| 圣诞是什么意思| 宫颈糜烂什么症状| 周角是什么| 为什么16岁不能吃维生素B| 苹果醋什么时候喝最好| 最近爆发什么病毒感染| 感冒吃什么水果好得快| 地瓜是什么| 鹅肝为什么那么贵| 茹什么饮什么| adr是什么| 刘三姐是什么生肖| 如履薄冰是什么意思| 贻笑大方什么意思| renewal什么意思| 泸州老窖是什么香型| 饭前饭后吃药有什么区别| 补丁是什么意思| 梦见买衣服是什么意思| 脚心长痣代表什么| 症瘕痞块是什么意思| 南北杏和什么煲汤止咳化痰| 血压高吃什么菜和水果能降血压| 戒指戴无名指是什么意思| 中暑了吃什么| 灵芝长什么样| 凉拌什么菜好吃| 为什么下巴经常长痘痘| 织锦缎是什么面料| 是什么结构| 嘴干是什么原因| o是什么| 错落有致的意思是什么| 人突然消瘦是什么原因| 抗核抗体阳性对怀孕有什么影响| 什么是豆粕| 海螺吃什么| 治疗静脉曲张有什么药| 生理盐水有什么作用| 什么不动| 健康证要带什么| 吃什么补身体| 08属什么生肖| 子宫切除后对身体有什么影响| sakose是什么牌子| 催乳素偏高有什么影响| 杜仲泡水喝有什么功效| mop是什么意思| 湿气重吃什么药最好| 干贝是什么东西| 生理期不能吃什么水果| 头痛眼睛痛什么原因引起的| 叶酸片有什么作用| 男宠是什么意思| 让心归零是什么意思| 鹞是什么意思| 什么情况下需要做活检| 临兵斗者皆阵列在前什么意思| cnm是什么意思| 三月三十号是什么星座| 流星雨是什么意思| lmy是什么意思| 2008年是什么年| iris是什么意思啊| 身上汗味重是什么原因| 绝代双骄是什么意思| 教师的职责是什么| 喉咙痛鼻塞吃什么药| 百度Jump to content

完善制度体系,为经济高质量发展保驾护航

From Wikipedia, the free encyclopedia
百度 阿塔有着长形头骨,还有肋骨等构造,但身长只有15公分,先前阿塔还一度被认为是6~8岁的孩子。

In object-oriented programming, a destructor (sometimes abbreviated dtor[1]) is a method which is invoked mechanically just before the memory of the object is released.[2] It can happen either when its lifetime is bound to scope and the execution leaves the scope, when it is embedded in another object whose lifetime ends, or when it was allocated dynamically and is released explicitly. Its main purpose is to free the resources (memory allocations, open files or sockets, database connections, resource locks, etc.) which were acquired by the object during its life and/or deregister from other entities which may keep references to it. Destructors are necessary in resource acquisition is initialization (RAII).

With most kinds of automatic garbage collection algorithms, the releasing of memory may happen a long time after the object becomes unreachable, making destructors unsuitable for time-critical purposes. In these languages, the freeing of resources is done through an lexical construct (such as try-finally, Python's with, or Java's "try-with-resources"), or by explicitly calling a function (equivalent to explicit deletion); in particular, many object-oriented languages use the dispose pattern.

Syntax

[edit]
  • C++: destructors have the same name as the class with which they are associated, but with a tilde prefix (for example, a class X with a constructor X() has a destructor ~X()).[2]
  • C#: same syntax as C++. Historically called destructors, now called finalizers due to confusion.[3]
  • D: declared as ~this() (whereas constructors are declared as this()).
  • Java: provided by 2 interfaces, Closeable (deprecated) and AutoCloseable. In Java 9+, destructors are replaced by Cleaner. Java also used to have Object.finalize(), which was also deprecated.
  • Object Pascal: destructor methods have the keyword destructor and can be any name, but convention is Destroy.
  • Objective-C: destructor method is named dealloc.
  • Perl: destructor method is named DESTROY; in the Moose object system extension, it is named DEMOLISH.
  • PHP: In PHP 5+, destructor method is named __destruct. There were no destructors in prior versions of PHP.[4]
  • Python: destructor method is named __del__. Called destructors in Python 2,[5] now called finalizers in Python 3.[6]
  • Rust: destructor method is named drop and is provided by the Drop trait.[7]
  • Swift: destructor method is named deinit.

Language details

[edit]

C++

[edit]

The destructor has the same name as the class, but with a tilde (~) before it.[2] For example, a class called Foo will have the destructor ~Foo(). Additionally, destructors have neither parameters nor return types.[2] As stated above, a destructor for an object is called whenever the object's lifetime ends.[2] If the object was created as an automatic variable, its lifetime ends and the destructor is called automatically when the object goes out of scope. Because C++ does not have garbage collection, if the object was created with a new statement (dynamically on the heap), then its destructor is called when the delete operator is applied to a pointer to the object. Usually that operation occurs within another destructor, typically the destructor of a smart pointer object.

In inheritance hierarchies, the declaration of a virtual destructor in the base class ensures that the destructors of derived classes are invoked properly when an object is deleted through a pointer-to-base-class. Objects that may be deleted in this way need to inherit a virtual destructor.

A destructor should never throw an exception.[8]

Non-class scalar types have what's called a pseudo-destructor which can be accessed by using typedef or template arguments. This construct makes it possible to write code without having to know if a destructor exists for a given type.

int f() {
    int a = 123;
    using T = int;
    a.~T();
    return a; // undefined behavior
}

In older versions of the standard, pseudo-destructors were specified to have no effect, however that was changed in a defect report to make them end the lifetime of the object they are called on.[9]

Objects which cannot be safely copied and/or assigned should be disabled from such semantics by declaring their corresponding functions as deleted. A detailed description of this method can be found in Scott Meyers' popular book, Effective Modern C++ (Item 11: "Prefer deleted functions to private undefined ones."[10]). If they are marked deleted, they should be public so that accidental uses do not warn that they are private, but explicitly deleted. Since C++26, it is possible to specify a reason for the deletion.

Example

[edit]
import std;

class Foo {
private:
    char data[];
    friend struct std::formatter<Foo>;
public:
    // Constructor
    explicit Foo(const char* s = ""): 
        data{new char[std::strlen(s) + 1]} {
        std::strcpy(data, s);
    }

    Foo(const Foo& other) = delete("Copy construction disabled");
    Foo& operator=(const Foo& other) = delete("Copy assignment disabled");

    // Destructor
    ~Foo() { 
        delete[] data; 
    }
};

template <>
struct std::formatter<Foo> {
    constexpr auto parse(std::format_parse_context& ctx) -> const char* {
        return ctx.end();
    }

    template <typename FormatContext>
    auto format(const Foo& foo, FormatContext& ctx) -> FormatContext::iterator {
        return std::format_to(ctx.out(), "{}", foo.data);
    }
};

int main(int argc, char* argv[]) {
    Foo foo("Hello from the stack!");
    std::println("{}", foo);

    Foo* foo = new Foo("Hello from the heap!");
    std::println("{}", *foo);
    delete foo;
}

By using smart pointers with the "Resource Acquisition is Initialization" (RAII) idiom, manually defining destructors or calling resource cleanup can be bypassed. Other languages like Java and C# include a finally block for cleanup, however C++ does not have the finally block and instead encourages using the RAII idiom.

import std;

class Foo {
private:
    std::unique_ptr<char[]> data;
    friend struct std::formatter<Foo>;
public:
    // Constructor
    explicit Foo(const char* s = ""):
        data{std::make_unique<char[]>(std::strlen(s) + 1)} {
        std::strcpy(data.get(), s);
    }

    Foo(const Foo& other) = delete("Copy construction disabled");
    Foo& operator=(const Foo& other) = delete("Copy assignment disabled");

    // Destructor is automatically handled by unique_ptr
    ~Foo() = default;
};

template <>
struct std::formatter<Foo> {
    constexpr auto parse(std::format_parse_context& ctx) -> const char* {
        return ctx.end();
    }

    template <typename FormatContext>
    auto format(const Foo& foo, FormatContext& ctx) -> FormatContext::iterator {
        return std::format_to(ctx.out(), "{}", foo.data.get());
    }
};

int main(int argc, char* argv[]) {
    Foo foo("Hello from the stack!");
    std::println("{}", foo);

    std::unique_ptr<Foo> foo = std::make_unique<Foo>("Hello from the heap!");
    std::println("{}", *foo);
}

C#

[edit]

Destructors in C# are not manually called or called by a delete operator like in C++. They are only called by the garbage collector.

UML class in C# containing a constructor and a destructor.
using System;

class MyClass
{
    private string resource;

    public MyClass(string resourceName)
    {
        resource = resourceName;
    }

    ~MyClass()
    {
        Console.WriteLine($"Destructor called to clean up resource: {resource}");
        // cleanup code
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass("Sample Resource");
        
        GC.Collect();
        GC.WaitForPendingFinalizers();

        Console.WriteLine("Program finished");
    }
}

C# also has a "dispose" pattern in which the class must implement the interface IDisposable. C# supports try-with-resources blocks similar to Java, called using-with-resources. A class must implement IDisposable to be used in a using-with-resources block.

using System;

class MyClass : IDisposable
{
    private string resource;
    private bool disposed = false; // To detect redundant calls to Dispose()

    public MyClass(string resourceName)
    {
        resource = resourceName;
    }

    ~MyClass()
    {
        Console.WriteLine("Destructor called");
        Dispose(false);
    }

    public void Dispose()
    {
        Console.WriteLine("Disposer called");
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                Console.WriteLine("Disposing managed resources.");
            }
            Console.WriteLine("Disposing unmanaged resources.");
            disposed = true;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (Destructible d = new Destructible())
        {
            Console.WriteLine("Using Destructible.");
            // ...
        }
        // after using-with-resources, d.Dispose() will be called
    }
}

C with GCC extensions

[edit]

The GNU Compiler Collection's C compiler comes with 2 extensions that allow implementing destructors:

  • The destructor function attribute[11] allows defining global prioritized destructor functions: when main() returns, these functions are called in priority order before the process terminates. See also: Hacking the art of exploitation.[12]
  • The cleanup variable attribute allows attaching a destructor function to a variable: the function is called when the variable goes out of scope.

Java

[edit]

Java provides 2 interfaces that implement destructors, java.lang.Closeable (deprecated) and java.lang.AutoCloseable. A class that implements AutoCloseable is able to be used in a "try-with-resources" block, available since Java 7.[13]

final class Destructible implements AutoCloseable {
    @Override
    public void close() {
        // cleanup code 
    }
}

public final class Example {
    try (Destructible d = new Destructible()) {
        System.out.println("Using Destructible.");
        // ...
    }
    // after try-with-resources, d.close() will be called
    
}

Prior to Java 7, a "try-finally" block was used.

final class Destructible {
    public void close() { 
        // cleanup code
    }
}

public final class Example {
    try {
        Destructible d = new Destructible();
        System.out.println("Using Destructible.");
    } finally {
        d.close()
    }
    
}

Historically, Java used Object.finalize() instead, however this has been deprecated. Java has a method called System.gc() to suggest the Java Virtual Machine (JVM) to perform garbage collection, which internally calls Runtime.getRuntime().gc(), which requests the garbage collector to trigger a garbage collection cycle, but this is not guaranteed, as the JVM manages memory independently. System.gc() may lead to finalize() being called, but only if the object is eligible for garbage collection and has a finalize() method.

class ParentFinalizerExample { ... }

class FinalizerExample extends ParentFinalizerExample {
    @Override
    protected void finalize() throws Throwable {
        try {
            System.out.println("finalize() called, cleaning up...");
        } finally {
            super.finalize(); // Always call super.finalize() to clean parent classes
        }
    }
}

public class Example {
    public static void main(String[] args) {
        FinalizerExample obj = new FinalizerExample ();
        obj = null;
        System.gc(); // Requests garbage collection (not guaranteed)
    }
}

Java also supports classes java.lang.ref.Cleaner and java.lang.ref.PhantomReference for safer low-level cleanup. Cleaner was introduced in Java 9 and is more efficient than PhantomReference, and works by registering an object with a cleaner thread which runs a cleanup action once the object is unreachable (i.e. no references to it exist).

import java.lang.ref.Cleaner;
import java.lang.ref.Cleaner.Cleanable;

class Resource {
    private static final Cleaner cleaner = Cleaner.create();

    static class State implements Runnable {
        private boolean cleaned = false;

        @Override
        public void run() {
            cleaned = true;
            System.out.println("Cleaned using Cleaner");
        }
    }

    private final State state;
    private final Cleanable cleanable;

    public Resource () {
        this.state = new State();
        this.cleanable = cleaner.register(this, state);
    }

    public void cleanup() {
        System.gc(); // Request garbage collection (not guaranteed)
    }
}

public class Example {
    public static void main(String[] args) {
        Resource resource = new Resource();
        resource = null;
        resource.cleanup();
    }
}

PhantomReference, since Java 1.2, is an older cleanup mechanism that uses a reference queue. PhantomReference is used solely for being notified that an object's garbage collection is pending. Once the object is garbage collected, the PhantomReference is enqueued into the ReferenceQueue. Unlike WeakReference which can be used to access the object if it still exists in memory, PhantomReference can only be used for detecting when an object will be destroyed. Both PhantomReference and WeakReference do not increase reference counts.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

class Resource {
    private final String name;

    public Resource(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class PhantomReferenceExample {
    public static void main(String[] args) throws InterruptedException {
        Resource resource = new Resource("My resource");
        ReferenceQueue<Resource> queue = new ReferenceQueue<>();
        PhantomReference<Resource> phantomRef = new PhantomReference<>(resource, queue);

        resource = null;

        System.gc();

        Reference<? extends Resource> ref = queue.poll();
        if (ref != null) {
            System.out.printf("Object is ready to be collected: %s%n", ((PhantomReference<?>)ref).get());
        }
    }
}

Python

[edit]

Python supports destructors and has a del keyword, but unlike delete in C++, del only decreases the reference count of the object, and does not necessarily immediately destroy the object.

class Destructible:
    def __init__(self, name: str) -> 'Destructible':
        self.name = name
        print(f"Created Destructible: {self.name}")

    def __del__(self) -> None:
        print(f"Destructor called for: {self.name}")

if __name__ == "__main__":
    d: Destructible = Destructible("My name")
    print(f"Using Destructible: {d.name}")
    del d

Much like Java and C#, Python has a try-with-resources block, called a with block or a "context manager". It is used for things like files and network connections.

from typing import Optional

class Destructible:
    def __init__(self, name: str) -> None:
        self.name: str = name
    
    def __enter__(self) -> 'Destructible':
        print(f"Entering context (allocating resource: {self.name})")
        return self

    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception], exc_tb: Optional[type]) -> None:
        print(f"Exiting context (cleaning up resource: {self.name})")

if __name__ == "__main__":
    with Destructible("Resource A") as d:
        print(f"Using resource {d.name} inside context")

    # Most Python standard library resources support with blocks:
    with open(file_path, 'r') as file:
        print("Reading the file content:")
        content: str = file.read()
        print(content)

Rust

[edit]

Rust does not have destructors in the sense of object-oriented programming, but a struct can implement the Drop trait and the drop method to clean itself up after it goes out of scope.

It is not possible to destroy objects explicitly through a delete operator like in C++, though it is possible to manually call drop() prematurely by using std::mem::drop().

use std::mem;

struct Destructible {
    name: String,
}

impl Destructible {
    fn new(name: String) -> Self {
        Destructible { name }
    }
}

impl Drop for Destructible {
    fn drop(&mut self) {
        println!("Dropping Destructible: {}", self.name);
    }
}

fn main() {
    {
        let resource_a: Destructible = Destructible::new(String::from("Resource A"));
        println!("Using Destructible.");
    } // <--- resource_a goes out of scope here, `drop()` is called automatically

    let resource_b: Destructible = Destructible::new(String::from("Resource B"));
    println!("Dropping Destructible prematurely.");
    mem::drop(resource_b);
}

While lifetimes control the validity of references, they do not determine when drop() is called.

Xojo

[edit]

Destructors in Xojo (REALbasic) can be in one of two forms. Each form uses a regular method declaration with a special name (with no parameters and no return value). The older form uses the same name as the Class with a ~ (tilde) prefix. The newer form uses the name Destructor. The newer form is preferred because it makes refactoring the class easier.

Class Foobar
  // Old form
  Sub ~Foobar()
  End Sub

  // New form
  Sub Destructor()
  End Sub
End Class

See also

[edit]

References

[edit]
  1. ^ "dtor". TheFreeDictionary.com. Retrieved 2025-08-06.
  2. ^ a b c d e Sebesta, Robert W. (2012). ""11.4.2.3 Constructors and Destructors"". Concepts of Programming Languages (print) (10th ed.). Boston, MA, USA: Addison-Wesley. p. 487. ISBN 978-0-13-139531-2.
  3. ^ "Finalizers (C# Programming Guide)".
  4. ^ Constructors and Destructors, from PHP online documentation
  5. ^ "3. Data model — Python 2.7.18 documentation".
  6. ^ "3. Data model — Python 3.10.4 documentation".
  7. ^ "Destructors - the Rust Reference".
  8. ^ GotW #47: Uncaught exceptions Accessed 31 July 2011.
  9. ^ Smith, Richard; Voutilainen, Ville. "P0593R6:Implicit creation of objects for low-level object manipulation". open-std.org. Retrieved 2025-08-06.
  10. ^ Scott Meyers: Effective Modern C++, O'REILLY, ISBN 9781491903995
  11. ^ C "destructor" function attribute
  12. ^ Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.
  13. ^ Bloch, Joshua (2018). Effective Java (3rd ed.). Addison-Wesley. pp. 29–31. ISBN 978-0134685991.
糖尿病吃什么食物 1927年属什么生肖 人的祖先是什么 葫芦鸡为什么叫葫芦鸡 胎动突然频繁是什么原因
背后长痘痘是什么原因 ost是什么 大便前面硬后面稀是什么原因 杓是什么意思 97年属什么的生肖
异地办理护照需要什么材料 屁很多是什么原因造成的 怀孕呕吐吃什么可以缓解 男扮女装是什么意思 芝士是什么做的
头发长得慢是什么原因 百折不挠的意思是什么 海王星是什么颜色 血癌是什么原因造成的 什么茶降血脂最好
什么的原野hcv9jop3ns3r.cn 跟着好人学好人下句是什么hcv8jop7ns2r.cn 卫生湿巾是干什么用的cl108k.com vave是什么意思sanhestory.com 眼睛睁不开是什么原因hcv7jop7ns3r.cn
客厅挂钟放在什么位置好hcv9jop4ns9r.cn 梦见墓碑是什么意思hcv9jop5ns7r.cn 雷特综合症是什么症状hcv8jop8ns9r.cn 为什么会口臭hcv8jop8ns6r.cn tf是什么hcv8jop3ns0r.cn
血小板分布宽度偏低是什么原因0735v.com 男子精少吃什么药可以生精cl108k.com 老鼠疮是什么病hcv7jop9ns8r.cn 打开图片用什么软件hcv7jop6ns0r.cn 五味杂粮什么意思hcv8jop8ns5r.cn
什么的梦zsyouku.com 什么是势能hcv9jop1ns0r.cn 梦见吃老鼠肉是什么意思啊hcv9jop0ns7r.cn 中耳炎吃什么药效果好tiangongnft.com 石墨灰是什么颜色hcv9jop7ns1r.cn
百度